题目
第一行一个整数 n,表示班上人数。接下来 n 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 50)。第 n+2 行一个整数 m,表示教练报的名字。接下来 m 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 50)。
输出格式:
对于每个教练报的名字,输出一行。如果该名字正确且是第一次出现,输出“OK”,如果该名字错误,输出“WRONG”,如果该名字正确但不是第一次出现,输出“REPEAT”。(均不加引号)
题解
可以用字符串hash,也可以用字典树trie
trie挺好理解的,主要包括加入一个单词和查找一个单词两种功能
这题有点模板啦
代码
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int n,m,tot,trie[1000000][26],e[1000000],f[1000000];
void insert(char *s){
int p=0;
for (int k=0;k<strlen(s);k++){
if (trie[p][s[k]-'a']==0)
trie[p][s[k]-'a']=++tot;
p=trie[p][s[k]-'a'];
}
e[p]=1;
}
int search(char *s){
int p=0;
for (int k=0;k<strlen(s);k++){
p=trie[p][s[k]-'a'];
if (p==0) return(2);
}
if (!e[p]) return(2);
if (!f[p]){
f[p]=1;
return(1);
}
return(3);
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
char x[55];
scanf("%s",&x);
insert(x);
}
scanf("%d",&m);
for (int i=1;i<=m;i++){
char x[55];
scanf("%s",&x);
int k=search(x);
if (k==1) printf("OK\n");
if (k==2) printf("WRONG\n");
if (k==3) printf("REPEAT\n");
}
}