/*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小組。
輸出要求:
輸出將縮略語轉換成日常語言后的文檔。(將縮略語轉換成日常語言,其他字符保留原樣)。例:
百度的部門包括門戶搜索部,產品市場部,人力資源部,產品推廣部,市場發展部等等,其中門戶搜索部還包括自然語言處理小組。
評分規則:
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的翻譯。
*/
/*
? Name:
? Copyright:
? Author:
? Date: 27-05-06 15:37
? Description:
*/
/*
算法介紹:
1。創建一個language結構,它包含兩個字符串,分別用來存儲大寫字母串和對應的中文。
2。讀入數據N,大寫字母串和對應的中文(存儲到*lan),包含縮略語的相關文檔(存儲到textBefore[lenText])。
3。遍歷textBefore[lenText],將轉換成日常語言后的文檔存儲到textAfter[lenText],轉換的格式為:
????? 如果是漢字則不轉換,直接寫入textAfter[lenText];
????? 如果為大寫字母,則將其提取,存儲到eng[lenEng],遍歷lan,尋找與eng[lenEng]匹配的English[lenEng],將對應的Chinese[lenChi]存儲到chi[lenChi];然后把chi[lenChi]接到textAfter[lenText]。
4。輸出textAfter[lenText]。
*/
#include <iostream>
#include<string>
#include<fstream>
#include <time.h>
using namespace std;
const int lenEng = 11;
const int lenChi = 256;
const long lenText = 100001;
typedef struct{
????? char English[lenEng];
????? char Chinese[lenChi];
} language;
language * Readata(const char *filename, char text[], language *lan, int & N);
bool IsUpper(char ch);
void PiPei(const language *lan, int len, const char *eng, char *chi);
void Transducer(const language *lan, int len, const char *textBefore);
int main()
{
?time_t startTime;
?time_t endTime;
?time(&startTime);
????? language *lan;
????? char textBefore[lenText];
????? int N = 0;
?lan = Readata("in1.txt", textBefore, lan, N);
????? for (int i=0; i<N; i++)
??????????? cout << lan[i].English << ' ' << lan[i].Chinese << endl;
????? cout << textBefore << endl;
????? Transducer(lan, N, textBefore);
?time(&endTime);
//?cout << difftime(endTime, startTime) << endl;
?getchar();
?return 0;
}
void Transducer(const language *lan, int len, const char *textBefore)
{
????? char textAfter[lenText];
????? int topA = 0;
????? int topB = 0;
?????
????? while(textBefore[topB])
????? {
??????????? while (textBefore[topB] && !IsUpper(textBefore[topB]))
??????????? {
????????????????? textAfter[topA++] = textBefore[topB++];
??????????? }
??????????? textAfter[topA++] = '\0';
??????????? char eng[lenEng];
??????????? int topE = 0;
??????????? while (textBefore[topB] && IsUpper(textBefore[topB]))
??????????? {
????????????????? eng[topE++] = textBefore[topB++];
??????????? }
??????????? eng[topE++] = '\0';
??????????? if (textBefore[topB])
??????????? {
????????????????? char chi[lenChi];
????????????????? PiPei(lan, len, eng, chi);
????????????????? strcat(textAfter, chi);
????????????????? while(textAfter[topA])
??????????????????????? topA++;
??????????? }
????? }
????? cout << textAfter;
}
void PiPei(const language *lan, int len, const char *eng, char *chi)
{
????? for (int i=0; i<len; i++)
????? {
??????????? if (strcmp(eng, lan[i].English) == 0)
??????????? {
???????????????? strcpy(chi, lan[i].Chinese);
???????????????? return ;
??????????? }
????? }
}
bool IsUpper(char ch)
{
????? if (ch >= 'A' && ch <= 'Z')
??????????? return true;
????? return false;
}
language * Readata(const char *filename, char text[], language *lan, int & N)
{
????? fstream in(filename);
????? if (!in)
??????????? return 0;?? //結束程序執行
????? in >> N;
????? lan = new language[N];
????? int top = 0;
????? int n = 0;
????? while (!in.eof() && n < N)
????? {
??????????? in >> lan[top].English;
??????????? in >> lan[top].Chinese;
??????????? top++;
??????????? n++;
????? }
????? char buf[lenText];
????? while (!in.eof())
????? {
??????????? in >> buf;
??????????? strcat(text, buf);
????? }
????? in.close(); //關閉文件
????? return lan;
}