程序设计:百度语言翻译机

原创 2006年05月28日 22:18:00

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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

#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;
}


2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机

百度语言翻译机 2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机 时限 1s 百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特...

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

  • 2011年12月16日 15:47
  • 756KB
  • 下载

算法小记02--学习Python之百度语言翻译机

算法小记02--学习Python之百度语言翻译机 最近在无聊学习pyton语言,看到下面的ACM题目就试试手。 2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机 时限 ...

ACM1、百度语言翻译机

百度语言翻译机  百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈,会议,甚至在各中技术文档中都会大量运用。  为了让新员工可以更快地...
  • sarahyq
  • sarahyq
  • 2014年07月13日 20:38
  • 289

百度在线 翻译机

  • 2015年11月13日 01:35
  • 208KB
  • 下载

解释器模式--自定义语言翻译机(行为模式03)

什么是行为模式 给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。 文法和解释器是编译原理课程中的术语,这里我们说的通俗一点,以例子来说明。语法好比我们...

GALGAME语言翻译机v2.6.rar

  • 2014年10月24日 13:28
  • 1.16MB
  • 下载

C语言中英关键字翻译机

  • 2017年06月23日 19:37
  • 972B
  • 下载

裘宗燕翻译的《c++程序设计语言》

我看过两本华章翻译的书,《java编程思想》,再就是这一本,一句话,没有翻译得最烂的,只有更烂的,华章翻译的任何书,再不买了。 《java编程思想》大部分还看得下去,这本是不和英文版对照着看,不明白讲...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序设计:百度语言翻译机
举报原因:
原因补充:

(最多只允许输入30个字)