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

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


你可能感兴趣的:(C/C++)