Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4842062
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: C/C++

2008-11-04 21:41:53

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小组。
样例: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的翻译。


(说明: 重新研究了一下输入输出流,这个是修改过的第二版)

#include <iostream>
#include 
<fstream>
#include 
<string>
#include 
<list>
using namespace std;

struct CompareGreater
{
public:
 
bool operator()(pair<stringstring>& A, pair<stringstring>& B)
 
{
  
return A.first.length() > B.first.length();
 }

}
;

int main(int argc, char* argv[])
{
 
string fileName = argv[1];
 fstream fileIn(fileName.c_str(), ios::
in);

 
int N;
 fileIn
>>N;

 list
< pair<stringstring> > StringPairList;
 
for(int i = 0; i < N; i++)
 
{
  pair
<stringstring> tempPair;
  fileIn
>>tempPair.first;
  fileIn
>>tempPair.second;
  StringPairList.push_back(tempPair);
 }


 
string TargetString;
 getline(fileIn, TargetString, (
char)EOF);

 StringPairList.sort(CompareGreater());

 list
< pair<stringstring> >::iterator itr;
 
for(itr = StringPairList.begin();  itr != StringPairList.end(); itr++)
 
{
  
int nPos = TargetString.find((*itr).first);
  
while(nPos != -1)
  
{
   TargetString.replace(nPos, (
*itr).first.length(), (*itr).second.c_str());
   nPos 
= TargetString.find((*itr).first);
  }

 }


 cout
<<TargetString;
 fileIn.close();

 
return 0;
}

我的ps

此程序在linux+g++平台上顺利运行,windows下vc++出错,据资料显示为vc++的STL库除了点小bug,可见STL在程序设计中的重要性。
阅读(3073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~