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
#include
#include
#include
#define Q1_TRUE 1
#define Q1_FALSE 0
char g_arrStringPair[10000][2][255];
char g_szBuf[1000000 + 2];
long g_arrSortedPair[10000];
long g_lLength;
long compare( const void *arg1, const void *arg2)
{
return strcmp( g_arrStringPair[* ( long* ) arg1][0], g_arrStringPair[* ( long* ) arg2][0] );
}
int bcompare( const void *arg1, const void *arg2 )
{
/* Compare all of both strings: */
return strcmp( (char*)arg1, g_arrStringPair[*(long*)arg2][0] );
}
char * ReadInt(char * sz, long * out)
{
long i;
long lPos;
char szBuf[100];
for (i = 0; ' ' == sz[i]; i++)
{
/* nothing */
}
lPos = i;
for (; sz[i] && ' ' != sz[i]; i++)
{
/* nothing */
}
strncpy(szBuf, sz + lPos, i - lPos);
szBuf[i - lPos] = '/0';
*out = atol(szBuf);
return sz + i;
}
void ReadStringPair(char *sz, long lIndex)
{
long i;
for (i = 0; sz[i] && ' ' != sz[i]; i++)
{
/* nothing */
}
strncpy(g_arrStringPair[lIndex][0], sz, i);
g_arrStringPair[lIndex][0][i] = '/0';
for (; ' ' == sz[i]; i++)
{
/* nothing */
}
strcpy(g_arrStringPair[lIndex][1], sz + i);
g_arrStringPair[lIndex][1][strlen(sz + i) - 1] = '/0';
}
char IsGBKWord(char * sz)
{
unsigned char c = *sz;
int ch1 = c;
int ch2;
c = *(sz + 1);
ch2 = c;
if (ch1 >= 0x81 && ch1 <= 0xFE && ch2 != 0x7F)
{
return Q1_TRUE;
}
else
{
return Q1_FALSE;
}
}
void ProcessString(char *sz)
{
long i;
char szBuf[1000];
char szCh[3];
char isMeetEn = Q1_FALSE;
long lLast = 0;
long * pTemp;
for (i = 0; sz[i]; i++)
{
if (IsGBKWord(sz + i))
{
if (isMeetEn)
{
strncpy(szBuf, sz + lLast, i - lLast);
szBuf[i - lLast] = '/0';
pTemp = (long*)bsearch(szBuf, g_arrSortedPair, g_lLength, sizeof(char*), bcompare);
printf("%s", g_arrStringPair[*pTemp][1]);
isMeetEn = Q1_FALSE;
}
strncpy(szCh, sz + i, 2);
szCh[2] = '/0';
printf("%s", szCh);
i++;
continue;
}
else
{
if (!isMeetEn)
{
lLast = i;
isMeetEn = Q1_TRUE;
}
}
}
}
int main(int argc, char* argv[])
{
FILE * fp = fopen(argv[1], "r");
char szBuf[4096];
long i;
long lLen;
fgets(szBuf, 4096, fp);
ReadInt(szBuf, &lLen);
g_lLength = lLen;
for (i = 0; i < lLen; i++)
{
fgets(szBuf, 4096, fp);
ReadStringPair(szBuf, i);
g_arrSortedPair[i] = i;
}
fgets(g_szBuf, 1000001, fp);
fclose(fp);
qsort(g_arrSortedPair, g_lLength, sizeof(long), compare);
ProcessString(g_szBuf);
return 0;
}