`
zuroc
  • 浏览: 1302332 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

2006年百度之星程序设计大赛试题-百度语言翻译机(解答)

    博客分类:
  • C++
阅读更多
 
题目+我的解答打包下载
http://www.cppblog.com/Files/zuroc/06_baidustar_translator.zip

题目:
百度语言翻译机

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

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

输入要求:
输入数据包含三部分:
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。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

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

cpp 代码
 
  1. /* 
  2. 我的思路 
  3.  
  4. 1.缩略语 
  5. vector< string >    //用来保存缩略语 
  6. 按string的length排序,来满足"缩略语的转换采用正向最大匹配". 
  7.  
  8. 2.一次性的进行文本替换,以防止替换内容再次被替换 
  9. map<pair<int,int>,string>        //位置范围-缩略语 
  10. vector<pair<int,int>>    //保存位置范围 
  11. map<string,string>    //缩略语 
  12. */  
  13.   
  14. #include <fstream>  
  15. #include <sstream>  
  16. #include <iostream>  
  17.   
  18. #include <vector>  
  19. #include <map>  
  20. #include <list>  
  21.   
  22. #include <string>  
  23.   
  24. #include <algorithm>  
  25. #include <functional>  
  26.   
  27. using namespace std;  
  28.   
  29. #define BEG_END(c)        (c.begin()),(c.end())  
  30.   
  31. typedef string::size_type str_size;  
  32.   
  33. /** 转换string为指定的类型 */  
  34. templatetypename Target, typename Source>  
  35. Target lexical_cast(const Source& arg)  
  36. {  
  37.     Target result;  
  38.     istringstream(arg)>>result;  
  39.     return result;  
  40. }  
  41.   
  42. vector<str_size> find_all(const string& source , const string& aim)  
  43. {  
  44.   
  45.     vector<str_size>    poses;  
  46.   
  47.     str_size pos=0;  
  48.     str_size aim_len=aim.size();  
  49.   
  50.     while ( (pos=source.find(aim, pos)) != string::npos)  
  51.     {  
  52.             poses.push_back(pos);  
  53.             pos += aim_len;  
  54.     }  
  55.   
  56.     return poses;  
  57. }  
  58.   
  59. bool is_long(const string& a , const string& b)  
  60. {  
  61.     return a.length()>b.length();  
  62. }  
  63.   
  64. bool is_first_small(const pair<str_size,str_size>& a , const  pair<str_size,str_size>& b)  
  65. {  
  66.     return a.first<b.first;  
  67. }  
  68.   
  69.   
  70.   
  71. templateclass T,class I>  
  72. bool not_in_scope(I begin,const I& end,const T& aim)  
  73. {  
  74.     for (;begin!=end;++begin)  
  75.     {  
  76.         if (  
  77.             (aim>=(begin->first) ) && (aim<= (begin->first+begin->second) )  
  78.         )return false;  
  79.     }  
  80.     return true;  
  81. }  
  82.   
  83. int main()  
  84. {  
  85.   
  86.     string infile_name="in.txt" , outfile_name="out.txt";  
  87.   
  88.     ofstream outfile(outfile_name.c_str());  
  89.     //ostream& outfile = cout;  
  90.   
  91.     ifstream infile(infile_name.c_str());  
  92.     if (!infile)  
  93.     {  
  94.         cerr<<"Error : can't open input file "<<infile_name<<" .\n";  
  95.         return -1;  
  96.     }  
  97.   
  98.     string line;  
  99.     vector<string> abbr_dict;  
  100.     map<string,string>    abbr_word;  
  101.   
  102.     getline(infile,line);  
  103.     for (int i=lexical_cast<int>(line);i!=0;--i)  
  104.     {  
  105.         getline(infile,line);  
  106.         string abbr,word;  
  107.         istringstream(line)>>abbr>>word;  
  108.         abbr_dict.push_back(abbr);  
  109.         abbr_word[abbr]=word;  
  110.         //cout<<abbr<<' '<<word<<'\n';  
  111.     }  
  112.   
  113.     sort(BEG_END(abbr_dict),is_long);  
  114.   
  115.     while (getline(infile,line))  
  116.     {  
  117.         typedef vector<pair<str_size,str_size> > replace_scope;  
  118.   
  119.         replace_scope    to_replace_scope;  
  120.         map<pair<str_size,str_size>,string>    to_replace;  
  121.   
  122.         for (  
  123.             vector<string>::iterator i=abbr_dict.begin(),end=abbr_dict.end();  
  124.             i!=end;  
  125.             ++i  
  126.         )  
  127.         {  
  128.             vector<str_size>    poses=find_all(line,*i);  
  129.             str_size aim_len=i->size();  
  130.             for (vector<str_size>::iterator j=poses.begin(),end=poses.end();j  
  131.                     !=end;++j)  
  132.             {  
  133.                 pair<str_size,str_size> scope=make_pair(*j,aim_len);  
  134.                 if (not_in_scope(BEG_END(to_replace_scope),*j))  
  135.                 {  
  136.                     to_replace_scope.push_back(scope);  
  137.                     to_replace[scope]=*i;  
  138.                 }  
  139.             }  
  140.         }  
  141.   
  142.         sort(BEG_END(to_replace_scope),is_first_small);  
  143.   
  144.         str_size offset=0;  
  145.   
  146.         for (  
  147.             replace_scope::iterator i=to_replace_scope.begin(),end=to_replace_scope.end();  
  148.             i!=end;  
  149.             ++i  
  150.         )  
  151.         {  
  152.             str_size len=i->second ;  
  153.             string word=abbr_word[to_replace[*i]];  
  154.             line.replace(i->first+offset,len ,word);  
  155.             offset+=word.size()-len;  
  156.         }  
  157.   
  158.   
  159.         outfile<<line<<'\n';  
  160.     }  
  161.   
  162.     return 0;  
  163. }  
分享到:
评论
1 楼 Eastsun 2007-05-15  
很是怀疑楼主的算法时间复杂度能符合要求吗?
感觉用Trie Tree来处理会比楼主的快很多.

相关推荐

    百度语言翻译机(C,C++,C#实现)

    2006年百度之星程序设计大赛初赛题目——百度语言翻译机,题目不是很难,我用了C,C++,C#三种语言实现,在VS2008环境下编译通过。相关博文地址:http://blog.csdn.net/jocodeoe/article/details/7039285

    百度之星十年试题集

    ### 百度之星十年试题集知识点总结 #### 百度之星程序设计大赛概览 - **背景介绍**:“百度之星”是由百度公司主办的一项面向全国大学生的程序设计竞赛,自2005年起至今已成功举办多届。该比赛旨在通过算法挑战激发...

    百度翻译插件-谷歌浏览器

    【百度翻译插件】是为谷歌浏览器(Google Chrome)设计的一款强大的在线翻译工具,它集成了百度翻译的服务,使得用户在浏览网页时可以方便快捷地进行多语言之间的翻译。这款插件不仅支持文本翻译,还提供了诸多实用...

    Java调用百度翻译接口

    在IT行业中,API(应用...总之,通过Java调用百度翻译API,我们可以轻松地为应用程序添加翻译功能,满足用户的跨语言交流需求。在实际开发中,需要注意API的使用限制、安全性和性能优化,确保服务的稳定性和用户体验。

    PHP对接百度翻译接口API 实现多国语言翻译

    PHP对接百度翻译接口API 实现多国语言翻译

    translate-wechat-mini-program-master-百度翻译api实现微信翻译小程序.zip

    使用百度翻译的api,必须知道每种语言,百度翻译使用什么单词表示的: 解决语音问题:这是百度翻译女声语音的url,喜欢的朋友可以收藏,以后可能用得上 注意里面有两个参数,一个是lan意思是要读出出来的是什么语言...

    C# 多国语言翻译 百度翻译 基于百度翻译多国语言翻译工具 源码 实例

    在本文中,我们将深入探讨如何使用C#编程语言构建一个基于百度翻译的多国语言翻译工具。这个工具能够实现批量翻译和自动翻译的功能,极大地提高了工作效率。为了开始我们的讨论,首先需要了解几个关键概念。 1. **...

    计算机组成原理与汇编语言程序设计编程练习题.pdf

    - 汇编语言程序的执行:将源程序翻译成机器语言程序,并执行机器语言程序。 3. 编程技术: - 数据类型:整数、实数、字符等。 - 变量的定义和使用:定义变量、赋值、使用变量等。 - 控制结构:顺序结构、分支...

    汇编语言实验指导书(实验1 DEBUG基本命令使用 实验2 汇编语言程序的调试与运行 实验3 顺序结构程序设计 实验4 分支程序设计 实验5 循环程序设计 实验6 子程序设计 实验7 中断服务程序设计)

    通过上述实验指导书的学习,学生可以逐步掌握汇编语言的基本概念和操作技巧,从简单的指令使用到复杂的程序设计,每一步都旨在帮助学生深入理解汇编语言的编程思想和实践应用。这些实验不仅有助于提高学生的动手能力...

    e语言-百度在线翻译

    百度在线翻译API是百度开放平台提供的一项服务,它允许开发者通过调用API,将文本从一种语言翻译成另一种语言。要使用这个API,我们需要注册并获取百度API的密钥(AK和SK),这些密钥会在后续的请求中用于身份验证。...

    百度翻译API实现多语言的翻译(c#)

    **标题详解:**“百度翻译API实现多语言的翻译(c#)” 在IT领域,开发跨语言交流的应用或工具时,经常会用到翻译API。百度翻译API是百度公司提供的一个强大的在线翻译服务,它允许开发者通过接口调用,实现多种语言...

    百度在线 翻译机

    本翻译机支持下列语言翻译: 中英、英中、中日、日中、中韩、韩中、中法、法中、中西、西中、中泰、泰中、中阿、阿中、中俄、俄中、英日、日英、英泰、泰英、英阿、阿英、英西、西英、英葡、葡英。 主要使用了北大唐...

    Rust程序设计语言 Rust Programming Language

    《Rust程序设计语言》是官方的Rust编程语言教程,旨在帮助读者理解和掌握Rust语言的核心特性和最佳实践。这本书由Steve Klabnik和Carol Nichols撰写,并由Rust社区不断更新和完善。简体中文版是由Rust中文社区翻译的...

    BianYiYuanLi.rar_ bianyiyuanli_WHILE循环语句的翻译程序设计_do-while_翻译程序

    在翻译程序设计中,LL(1)分析器可以用于将高级语言转换为抽象语法树(AST),然后再进一步转换为三地址代码或目标代码。 三地址代码是一种中间表示,每个操作都有三个地址,分别代表操作数、操作符和结果。例如,`a...

    多应用型计算机程序设计开发-程序设计-设计.pdf

    "多应用型计算机程序设计开发-程序设计-设计" ...计算机程序设计语言发展和计算机程序设计方法发展变化是计算机程序设计的核心内容,多应用型计算机程序的设计开发是计算机程序设计的重要应用之一。

    微信小程序百度翻译代码

    本项目的核心是利用百度翻译API来实现小程序内的语言翻译功能。 百度翻译API是一个强大的在线翻译服务,支持多种语言之间的互译。在微信小程序中集成百度翻译,可以为用户提供便捷的翻译体验,比如在学习、旅行或者...

    windows程序设计--侯捷翻译.rar

    书 名:Programming Windows程式开发设计指南 出版日期:2000/6/2 书 号:957-8239-73-4 I S B N:957-8239-73-4 原 作 者:Charles Petzold 译 者:余孟学

Global site tag (gtag.js) - Google Analytics