<题目链接>
题目大意:
刚开始每行输入两个单词,第二个单词存入单词库,并且每行第二个单词映射着对应的第一个单词。然后每行输入一个单词,如果单词库中有相同的单词,则输出它对应的那个单词,否则输出“eh”。
解体分析:
本题是trie树的模板题,在建树的时候,在每个单词的结尾节点储存对应单词的序号即可。当然,本题用map也可做,但是效率不够高。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int MAXN = 100010; 8 const int N = 11; 9 const int M = 26; 10 11 struct Node{ 12 int index; 13 Node* child[M]; 14 Node(){ 15 index = -1; 16 for(int i = 0 ; i < M ; i++) 17 child[i] = NULL; 18 } 19 }; 20 Node* root; 21 22 int pos; 23 char word[MAXN][N]; 24 25 void insert(int index , char* str){ 26 Node* s = root; 27 int len = strlen(str); 28 for(int i = 0 ; i < len ; i++){ 29 int num = str[i]-'a'; 30 if(s->child[num] == NULL) 31 s->child[num] = new Node(); 32 s = s->child[num]; 33 } 34 s->index = index; //该单词的结束节点记录所对应字符串的序号 35 } 36 37 int search(char *str){ 38 Node* s = root; 39 int len = strlen(str); 40 for(int i = 0 ; i < len ; i++){ 41 int num = str[i]-'a'; 42 if(s->child[num] == NULL) 43 return -1; 44 s = s->child[num]; 45 } 46 return s->index; 47 } 48 49 int main(){ 50 pos = 0; 51 root = new Node(); 52 53 char str[N*3]; 54 char tmp[N]; 55 int cnt = 0; 56 57 while(gets(str) && str[0] != '\0'){ 58 sscanf(str , "%s %s" , word[cnt] , tmp); 59 insert(cnt++ , tmp); 60 } 61 62 while(scanf("%s" , tmp) != EOF){ 63 int index = search(tmp); 64 if(index == -1) 65 printf("eh\n"); 66 else 67 printf("%s\n" , word[index]); 68 } 69 return 0; 70 }
2018-10-29