今天看到百度语言翻译机的题目,闲着没有事就练习一下
试题:
百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套
独特的缩略语。他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。
为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决
定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。
输入要求:
输入数据包含三部分:
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小组。
样例:in.txt
输出要求:
输出将缩略语转换成日常语言后的文档。(将缩略语转换成日常语言,其他字符保留原
样)。例:
百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等
,其中门户搜索部还包括自然语言处理小组。
样例:out.txt
评分规则:
1.程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行
不能超过10秒,否则该用例不得分;
2.要求程序能按照输入样例的格式读取数据文件,按照输出样例的格式将运行结果输出
到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
3.该题目共有4个测试用例,每个测试用例为一个输入文件。各测试用例占该题目分数
的比例分别为25%,25%,25%,25%;
4.该题目20分。
注意事项:
1.输入数据是中英文混合的,中文采用GBK编码。
GBK:是又一个汉字编码标准,全称《汉字内码扩展规范》。采用双字节表示,总体编码
范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,排除xx7F。总计 2
3940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003
个,图形符号 883 个。2.为保证答案的唯一性,缩略语的转换采用正向最大匹配(从
左到右为正方向)原则。请注意样例中PMD的翻译
试题:
百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套
独特的缩略语。他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。
为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决
定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。
输入要求:
输入数据包含三部分:
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小组。
样例:in.txt
输出要求:
输出将缩略语转换成日常语言后的文档。(将缩略语转换成日常语言,其他字符保留原
样)。例:
百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等
,其中门户搜索部还包括自然语言处理小组。
样例:out.txt
评分规则:
1.程序将运行在一台Linux机器上(内存使用不作严格限制),在每一测试用例上运行
不能超过10秒,否则该用例不得分;
2.要求程序能按照输入样例的格式读取数据文件,按照输出样例的格式将运行结果输出
到标准输出上。如果不能正确读入数据和输出数据,该题将不得分;
3.该题目共有4个测试用例,每个测试用例为一个输入文件。各测试用例占该题目分数
的比例分别为25%,25%,25%,25%;
4.该题目20分。
注意事项:
1.输入数据是中英文混合的,中文采用GBK编码。
GBK:是又一个汉字编码标准,全称《汉字内码扩展规范》。采用双字节表示,总体编码
范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,排除xx7F。总计 2
3940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003
个,图形符号 883 个。2.为保证答案的唯一性,缩略语的转换采用正向最大匹配(从
左到右为正方向)原则。请注意样例中PMD的翻译
#include <iostream> #include <string> #include <fstream> #include <map> using namespace std; typedef map<string,string>::reverse_iterator RCIR; // 将DealString中的tokString替换为dstString void str_replace(string & DealString,const string & tokString,const string & dstString) { string::size_type len=tokString.size(); string::size_type steplen=dstString.size(); string::size_type npos=0; while( (npos=DealString.find(tokString,npos))!=string::npos) { DealString.replace(npos,len,dstString); npos +=steplen; } return; } int main(void) { map<string,string> MyMap; ifstream inFile("in.txt"); ofstream outFile("out.txt"); if(inFile==NULL) { cerr<<" 打开文件失败" <<endl; return -1; } if(outFile==NULL) { cerr<<" 创建文件失败" <<endl; return -1; } string KeyWorld; string KeyWorldStr; int KeyWorldCount=0; // 读取缩略语行数 inFile>>KeyWorldStr; KeyWorldCount =atoi(KeyWorldStr.c_str()); cout<<" 缩略语总共有" <<KeyWorldCount<<" 行" <<endl; cout<<"================================"<<endl; cout<<" 缩略语内容为:" <<endl; // 读取缩略语到map中 while(KeyWorldCount&&(inFile>>KeyWorld>>KeyWorldStr)) { MyMap[KeyWorld] =KeyWorldStr; KeyWorldCount--; } for(RCIR rpos=MyMap.rbegin(); rpos!=MyMap.rend(); rpos++) { cout<<rpos->first<<" "<<rpos->second<<endl; } // 替换缩略语 string TextLine; getline(inFile,TextLine,'/n'); while(getline(inFile,TextLine,'/n')) { for(RCIR rpos=MyMap.rbegin(); rpos!=MyMap.rend(); rpos++) { str_replace(TextLine,rpos->first,rpos->second); } outFile<<TextLine<<endl; } inFile.close(); outFile.close(); system("pause"); return 0; } |