/*1.百度语言翻译机
百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套独特的缩略语。他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。

为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。

输入要求:
输入数据包含三部分:
1. 第一行包含一个整数N(N<=10000),表示总共有多少个缩略语的词条;
2. 紧接着有N行的输入,每行包含两个字符串,以空格隔开。第一个字符串为缩略语(仅包含大写英文字符,长度不超过10字节),第二个字符串为日常语言(不包含空格,长度不超过255字节);
3. 从第N+2开始到输入结束为包含缩略语的相关文档(总长度不超过1000000个字节)。例:
6
PS 门户搜索部
NLP 自然语言处理
PM 产品市场部
HR 人力资源部
PMD 产品推广部
MD 市场发展部
百度的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。


输出要求:
输出将缩略语转换成日常语言后的文档。(将缩略语转换成日常语言,其他字符保留原样)。例:
百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。


评分规则:
1.程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行不能超过10秒,否则该用例不得分;
2.要求程序能按照输入样例的格式读取数据文件,按照输出样例的格式将运行结果输出到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
3.该题目共有4个测试用例,每个测试用例为一个输入文件。各测试用例占该题目分数的比例分别为25%,25%,25%,25%;
4.该题目20分。


注意事项:
1.输入数据是中英文混合的,中文采用GBK编码。
GBK:是又一个汉字编码标准,全称《汉字内码扩展规范》。采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,排除xx7F。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

2.为保证答案的唯一性,缩略语的转换采用正向最大匹配(从左到右为正方向)原则。请注意样例中PMD的翻译。

*/

/*
  Name:
  Copyright:
  Author:
  Date: 27-05-06 15:37
  Description:
*/
/*
算法介绍:
1。创建一个language结构,它包含两个字符串,分别用来存储大写字母串和对应的中文。
2。读入数据N,大写字母串和对应的中文(存储到*lan),包含缩略语的相关文档(存储到textBefore[lenText])。
3。遍历textBefore[lenText],将转换成日常语言后的文档存储到textAfter[lenText],转换的格式为:
      如果是汉字则不转换,直接写入textAfter[lenText];
      如果为大写字母,则将其提取,存储到eng[lenEng],遍历lan,寻找与eng[lenEng]匹配的English[lenEng],将对应的Chinese[lenChi]存储到chi[lenChi];然后把chi[lenChi]接到textAfter[lenText]。
4。输出textAfter[lenText]。
*/
#include <iostream>
#include<string>
#include<fstream>
#include <time.h>

using namespace std;

const int lenEng = 11;
const int lenChi = 256;
const long lenText = 100001;

typedef struct{
      char English[lenEng];
      char Chinese[lenChi];
} language;

language * Readata(const char *filename, char text[], language *lan, int & N);
bool IsUpper(char ch);
void PiPei(const language *lan, int len, const char *eng, char *chi);
void Transducer(const language *lan, int len, const char *textBefore);

int main()
{
 time_t startTime;
 time_t endTime;
 time(&startTime);

      language *lan;
      char textBefore[lenText];
      int N = 0;
 lan = Readata("in1.txt", textBefore, lan, N);

      for (int i=0; i<N; i++)
            cout << lan[i].English << ' ' << lan[i].Chinese << endl;
      cout << textBefore << endl;

      Transducer(lan, N, textBefore);

 time(&endTime);
// cout << difftime(endTime, startTime) << endl;

 getchar();
 return 0;
}

void Transducer(const language *lan, int len, const char *textBefore)
{
      char textAfter[lenText];
      int topA = 0;
      int topB = 0;
     
      while(textBefore[topB])
      {
            while (textBefore[topB] && !IsUpper(textBefore[topB]))
            {
                  textAfter[topA++] = textBefore[topB++];
            }
            textAfter[topA++] = '\0';

            char eng[lenEng];
            int topE = 0;
            while (textBefore[topB] && IsUpper(textBefore[topB]))
            {
                  eng[topE++] = textBefore[topB++];
            }
            eng[topE++] = '\0';
            if (textBefore[topB])
            {
                  char chi[lenChi];
                  PiPei(lan, len, eng, chi);

                  strcat(textAfter, chi);
                  while(textAfter[topA])
                        topA++;
            }
      }
      cout << textAfter;
}

void PiPei(const language *lan, int len, const char *eng, char *chi)
{
      for (int i=0; i<len; i++)
      {
            if (strcmp(eng, lan[i].English) == 0)
            {
                 strcpy(chi, lan[i].Chinese);
                 return ;
            }
      }
}
bool IsUpper(char ch)
{
      if (ch >= 'A' && ch <= 'Z')
            return true;
      return false;
}

language * Readata(const char *filename, char text[], language *lan, int & N)
{
      fstream in(filename);
      if (!in)
            return 0;   //结束程序执行

      in >> N;

      lan = new language[N];
      int top = 0;
      int n = 0;
      while (!in.eof() && n < N)
      {
            in >> lan[top].English;
            in >> lan[top].Chinese;
            top++;
            n++;
      }

      char buf[lenText];
      while (!in.eof())
      {
            in >> buf;
            strcat(text, buf);
      }

      in.close(); //关闭文件

      return lan;
}

Posted on 2006-05-30 13:52 梦想飞扬 阅读(898) 评论(4)  编辑 收藏 引用

Feedback

# re: 我解百度之星题目之" 百度语言翻译机 "  回复  更多评论   

2006-05-30 20:54 by welkin
可以用std::map的吗?那样查找起来应该快一些。
我的思路:
构造一个std::map<string, string> mapShort2Text, 从第二行开始读取N行数据,将读到的放入mapShort2Text,然后一次性读取N+2行后的数据放入string strDocument,再利用string::find_first_of和fird_first_not_of可以快速找到英文字符串,在mapShort2Text查找是否有匹配的单词,如果匹配就取出对应的text。不用在strDocument的基础上替换,因为那样要做内存拷贝,会变得慢。题目只是要求输出结果,所以将结果分开来输出就行了。

我的初步思路,希望可以得到大家更好的见解。

# re: 我解百度之星题目之" 百度语言翻译机 "  回复  更多评论   

2006-05-31 17:04 by liaoqs
你的五篇百度试题我都做了转载,谢谢!

# re: 我解百度之星题目之" 百度语言翻译机 "  回复  更多评论   

2006-06-06 02:12 by FVDF
[url=http://www.gltqzj.iambm.com]起重机[/url][url=http://www.ntzyj.iambm.com">http://www.ntzyj.iambm.com]卷扬机[/url][url=http://www.ntzyj.iambm.com">http://www.ntzyj.iambm.com]冲孔机[/url][url=http://www.ntkqc.iambm.com]空气锤[/url]
[url=http://www.shineblog.com/user4/ntdlq/archives/2006/410431.shtml]大力钳[/url][url=http://www.shineblog.com/user4/ntmc/archives/2006/411137.shtml">http://www.shineblog.com/user4/ntmc/archives/2006/411137.shtml]平面磨床[/url]
[url=http://www.ntdbj.iambm.com">http://www.ntdbj.iambm.com]打包机[/url][url=http://www.ntdbj.iambm.com">http://www.ntdbj.iambm.com]金属打包机[/url][url=http://www.shineblog.com/user4/ntmc/archives/2006/411137.shtml">http://www.shineblog.com/user4/ntmc/archives/2006/411137.shtml]磨床[/url]
[url=http://www.shineblog.com/user4/ntssj/archives/2006/412187.shtml]送丝机[/url]
[url=http://www.shineblog.com/user4/ntzkb/archives/2006/412612.shtml]真空泵[/url]
[url=http://www.jhxdjx.com/jsj/product.htm]脚手架[/url][url=http://www.jhxdjx.com/blg/product.htm]玻璃钢格栅[/url]


# re: 我解百度之星题目之" 百度语言翻译机 "  回复  更多评论   

2006-06-06 02:13 by FVDF
[url=http://www.shineblog.com/user4/mhdbj/archives/2006/397430.shtml]垃圾打包机[/url][url=http://www.shineblog.com/user4/xtwjx/archives/2006/397705.shtml]剪板机[/url]

[url=http://www.shineblog.com/user4/lxfj/archives/2006/405763.shtml]离心风机[/url][url=http://www.shineblog.com/user4/ntmmj/archives/2006/406765.shtml]磨毛机[/url]
[url=http://www.gltqzj.iambm.com]起重机[/url][url=http://www.ntzyj.iambm.com">http://www.ntzyj.iambm.com]卷扬机[/url][url=http://www.ntzyj.iambm.com">http://www.ntzyj.iambm.com]冲孔机[/url][url=http://www.ntkqc.iambm.com]空气锤[/url]

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理