`
zuroc
  • 浏览: 1317883 次
  • 性别: 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年起至今已成功举办多届。该比赛旨在通过算法挑战激发学生的编程兴趣和创新能力,同时选拔...

    matlab实时接收蓝牙和串口数据,并实时显示.zip

    matlab

    共享汽车管理系统.zip

    Java项目基于Springboot框架的课程设计,包含LW+ppt

    面板数据-A股公司监管距离数据集-含原始数据+参考文献+处理代码(2000-2023年).txt

    因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/T0620514/article/details/146715315

    储能系统中双向DC/DC变换器并联运行的下垂控制与电流分配优化

    内容概要:本文详细探讨了储能系统中双向DC/DC变换器并联运行时的下垂控制技术及其电流分配优化方法。首先介绍了下垂控制的基本概念,即通过虚拟电阻实现电流按比例分配,避免个别变换器过载或欠载。接着讨论了电压补偿机制,用于应对负载变化引起的母线电压波动。文中提供了具体的Python代码示例,展示了如何通过虚拟电阻和下垂系数进行电流分配,并通过电压补偿保持母线电压稳定。此外,还涉及了线路阻抗对电流分配的影响以及相应的在线估算方法。最后,提出了动态虚拟阻抗和自适应控制等前沿研究方向。 适合人群:从事电力电子、储能系统设计与维护的技术人员,以及对分布式电源管理感兴趣的科研人员。 使用场景及目标:适用于需要精确控制并联运行的双向DC/DC变换器电流分配的储能系统设计和调试。主要目标是提高系统的稳定性和效率,确保电流均匀分布,防止单个变换器过载或欠载。 其他说明:文中提供的代码示例和调试技巧有助于理解和实施下垂控制技术。同时,强调了参数整定的重要性,并给出了实际调试过程中的一些经验和教训。

    (源码)基于Python的微信智能聊天机器人.zip

    # 基于Python的微信智能聊天机器人 ## 项目简介 本项目旨在将微信打造成一个智能聊天机器人,支持多端部署,包括个人微信、微信公众号和企业微信应用。机器人能够进行智能对话、语音识别、图片生成等功能,并且支持丰富的插件扩展,如多角色切换、文字冒险、敏感词过滤等。 ## 项目的主要特性和功能 多端部署支持个人微信、微信公众号和企业微信应用等多种部署方式。 智能对话支持私聊及群聊的消息智能回复,支持多轮会话上下文记忆,支持GPT3、GPT3.5、GPT4模型。 语音识别可识别语音消息,通过文字或语音回复,支持Azure、Baidu、Google、OpenAI等多种语音模型。 图片生成支持图片生成和图生图(如照片修复),可选择DellE、Stable Diffusion、Replicate模型。 丰富插件支持个性化插件扩展,已实现多角色切换、文字冒险、敏感词过滤、聊天记录总结等插件。

    15kW数字充电桩开发方案:三相PFC+移相全桥电路与DSP控制详解

    内容概要:本文详细介绍了15kW数字充电桩的开发方案,重点讨论了三相PFC和移相全桥电路的设计与实现。三相PFC采用无桥维也纳结构,利用TI的DSP进行数字化控制,提高了效率并降低了直流母线电压纹波。移相全桥则通过精确的时序控制和合理的PCB布局,实现了高效的ZVS软开关。文中还探讨了双DSP架构的协同机制、散热设计、EMC优化以及通讯协议等方面的技术细节,并分享了一些开发过程中遇到的实际问题及其解决方案。 适用人群:从事电力电子、充电桩开发的技术人员,尤其是对大功率电源设计感兴趣的工程师。 使用场景及目标:适用于希望深入了解和掌握15kW充电桩开发技术的专业人士,旨在帮助他们提高设计水平,解决实际开发中的难题。 其他说明:文章不仅提供了理论指导,还结合了大量的实践经验,包括具体的电路图、代码示例和调试技巧,有助于读者更好地理解和应用相关技术。

    七彩汽球幼儿园教育教学课件模板.pptx

    七彩汽球幼儿园教育教学课件模板

    基于MATLAB Simulink自动生成TMS320F28335 DSP代码实现永磁同步电机电流环控制

    内容概要:本文详细介绍了使用MATLAB Simulink搭建模型并自动生成针对TMS320F28335 DSP的代码,用于实现永磁同步电机(PMSM)的电流环控制。主要内容涵盖硬件选择、工具链配置、PWM和ADC模块的具体应用、id=0矢量控制策略以及电流环PI控制器的设计与优化。文中强调了Simulink与DSP结合的优势,如减少手动编写寄存器配置代码的工作量,同时提供了多个实际代码片段展示生成代码的关键部分及其优化方法。 适合人群:具有一定嵌入式开发经验,特别是熟悉DSP和电机控制领域的工程师和技术爱好者。 使用场景及目标:适用于希望提高开发效率、缩短产品上市时间的研发团队。通过学习本文,读者能够掌握如何利用Simulink进行自动化代码生成功能,从而快速构建稳定可靠的PMSM控制系统。 其他说明:尽管Simulink提供的自动生成代码功能极大简化了开发流程,但在某些情况下仍需深入了解硬件特性和底层机制,以便更好地解决可能出现的问题。此外,文中提到的一些具体参数和配置可能需要根据实际情况进行适当调整。

    2023年上半年广州房地产市场总结合富.pdf

    2023年上半年广州房地产市场总结

    约瑟夫环(循环链表和顺序表) 问题描述: 编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数) 一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序

    约瑟夫环(循环链表和顺序表) 问题描述: 编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。 1.循环链表 2.顺序表

    【计算机求职笔试】资源

    【计算机求职笔试】资源

    tacacs-libs-F4.0.4.28.7fb~20231005g4fdf178-2.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统tacacs-libs-F4.0.4.28.7fb~20231005g4fdf178-2.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tacacs-libs-F4.0.4.28.7fb~20231005g4fdf178-2.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    “壮族三月三”教学课件模板.pptx

    “壮族三月三”教学课件模板

    基于TMS320F28069的伺服驱动器设计方案详解与优化技巧

    内容概要:本文详细介绍了基于TMS320F28069的成熟量产型DIY伺服驱动器方案。硬件方面,采用四层板设计,将控制、驱动、电源、滤波等功能分区明确,选用高性能IGBT和MOS管,确保稳定性和高效性能。关键电路如PWM输出、电流环采样、PID算法等进行了深入剖析,并提供了优化建议。软件部分涵盖了ePWM模块配置、ADC采样、PID控制器实现以及FOC SVPWM算法等核心技术。此外,还特别强调了PCB布局、EMI设计、隔离电路等方面的经验教训。 适合人群:具有一定嵌入式开发经验和电机控制基础知识的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解伺服驱动器设计原理和实现方法的技术人员,旨在帮助他们掌握从硬件设计到软件编程的完整流程,提高产品性能和可靠性。 其他说明:文中提到多个具体实现细节和常见问题解决方案,对于初学者来说有一定的挑战性,建议先熟悉相关基础知识再进行尝试。

    在线商城系统设计与开发-代码.zip

    Java项目基于Springboot框架的课程设计,包含LW+ppt

    基于模糊神经网络的风光互补系统负荷功率智能分配与Simulink仿真

    内容概要:本文详细介绍了在风光互补发电系统中,利用模糊神经网络进行不同等级负荷的智能功率分配及其在Simulink/Matlab环境下的仿真实现。文中首先阐述了光伏和风机的MPPT算法,分别采用了扰动观察法和叶尖速比控制来优化能量捕获。接着深入探讨了模糊控制器的设计,包括输入输出变量选择、隶属度函数构建以及规则库制定。针对VSC逆变器的控制,讨论了锁相环参数设置和LC滤波器的应用,确保并网电流质量。此外,还分享了一些实用的仿真技巧,如Fast Restart功能的使用,以提高调试效率。 适用人群:从事电力电子、智能控制系统研究的技术人员,尤其是对风光互补发电系统感兴趣的科研工作者和工程技术人员。 使用场景及目标:适用于希望深入了解风光互补系统中智能功率分配机制的研究人员和技术开发者。目标是掌握模糊神经网络在复杂电力系统中的应用方法,提升系统的可靠性和效率。 其他说明:文章不仅提供了详细的理论分析,还包括具体的代码实现和实践经验,有助于读者更好地理解和应用于实际项目中。

    质子交换膜燃料电池阴极催化层梯度结构对其性能和耐久性的影响研究(复现论文,含详细可运行代码及解释)

    内容概要:本文复现了一篇关于质子交换膜燃料电池(PEMFC)阴极催化层梯度结构对其性能和耐久性影响的论文。文中详细介绍了1D Pt降解模型和1D PEMFC性能模型的相关参数设定、函数定义及其计算方法。通过Python代码实现了关键计算步骤,包括总表面张力、净Pt溶解速率、净Pt氧化速率、Pt颗粒直径和氧化物覆盖率的更新、Pt2+浓度场的求解、电化学活性表面积(ECSA)的计算以及极化曲线的绘制。此外,还增加了对催化剂层梯度结构的模拟,进一步探讨了其对电池性能的影响。 适合人群:具备一定编程基础和燃料电池基础知识的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解PEMFC内部机制、优化电池设计的研究人员。主要目标是通过模拟实验验证阴极催化层梯度结构对PEMFC性能和耐久性的具体影响。 阅读建议:读者可以结合论文原文,逐步理解和修改提供的Python代码,以适应不同的研究需求。同时,可以通过调整参数和边界条件,探索更多可能性。

    项目管理实用表格 - 软考高级-信息系统项目管理师

    项目管理实用表格 - 软考高级-信息系统项目管理师

Global site tag (gtag.js) - Google Analytics