这道题目就是裸的Trie树,当然了也可以用其他方法做。这里为了训练的目的用Trie树做。就是这道题的输入让人蛋疼。Orz
下面是代码,哈哈自己写的Trie的模板。
#include<stdio.h> #include<string.h> #define maxn 200010 struct node { char val[11]; int ok; } Val[maxn]; int ch[maxn][26]; char s1[11],s2[11],s[25]; int cnt; void insert_Trie(char *s1,char *s2) { int u = 0; while(*s1) { int id = *s1 - 'a'; if(ch[u][id] == 0) { Val[cnt].ok = 0; ch[u][id] = cnt++; } u = ch[u][id]; s1++; } Val[u].ok = 1; strcpy(Val[u].val,s2); } void query_Trie(char *s) { int u = 0; int ok = 1; while(*s) { int id = *s - 'a'; if(ch[u][id] == 0) { ok = 0; break; } u = ch[u][id]; s++; } if(ok && Val[u].ok) printf("%s\n",Val[u].val); else printf("eh\n"); } int main() { cnt = 1; memset(ch[0],0,sizeof(ch[0])); while(gets(s) && s[0] != 0) { int i,j; for(i = 0 ; s[i] != ' ';i++) s1[i] = s[i]; s1[i] = '\0'; for(j = 0, i += 1;s[i];i++,j++) s2[j] = s[i]; s2[j] = '\0'; insert_Trie(s2,s1); } while(scanf("%s",s1) != EOF) query_Trie(s1); return 0; }