第一行一个整数 n,表示班上人数。接下来 n 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 50)。第 n+2 行一个整数 m,表示教练报的名字。接下来 m 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 50)。
对于每个教练报的名字,输出一行。如果该名字正确且是第一次出现,输出“OK”,如果该名字错误,输出“WRONG”,如果该名字正确但不是第一次出现,输出“REPEAT”。(均不加引号)
这道题就是裸的trie,没什么好多说的。。
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int maxn=55; 6 int n, m; 7 char s[maxn]; 8 struct node{ 9 node *son[26]; 10 int num; 11 }root, *now; 12 13 int main(){ 14 scanf("%d", &n); 15 int len; 16 for (int i=0; i<n; ++i){ 17 scanf("%s", s); 18 len=strlen(s); 19 now=&root; 20 int c; //这里不能用nowson,因为复制过来以后就变成两个指针! 21 for (int i=0; i<len; ++i){ 22 c=s[i]-97; 23 if (now->son[c]==0) 24 now->son[c]=new node(); 25 now=now->son[c]; 26 } 27 } 28 scanf("%d", &m); 29 bool flag; 30 for (int i=0; i<m; ++i){ 31 scanf("%s", s); 32 len=strlen(s); 33 now=&root; 34 int c; 35 flag=false; 36 for (int i=0; i<len; ++i){ 37 c=s[i]-97; 38 if (!now->son[c]){ 39 flag=true; 40 break; 41 } 42 now=now->son[c]; 43 } 44 if (flag) { printf("WRONG "); continue; } 45 if (now->num++) printf("REPEAT "); 46 else printf("OK "); 47 } 48 return 0; 49 }