洛谷P2580
查询字符串是否出现过,以及是否重复出现。
#include<bits/stdc++.h>
using namespace std;
char s[55];
const int maxn=5e6+10;
int tree[maxn][26];
int vis[maxn];//标记第几次访问
int tot=0;
void addc(char *s)
{
int idx=0;
for (int i = 0; i < strlen(s); i++){
int x=s[i]-'a';
if(!tree[idx][x]){
tree[idx][x]=++tot;
}
idx=tree[idx][x];
}
vis[idx]=1;
}
int check(char *s)
{
int idx=0;
for(int i=0;i<strlen(s);i++){
int x=s[i]-'a';
idx=tree[idx][x];
if(!idx)
return 0;
}
if(vis[idx]==1){
vis[idx]=2;
return 1;
}
else if(!vis[idx])
return 0;
return 2;
}
int main()
{
//freopen("p2580.in","r",stdin);
int n;
cin>>n;
while (n--){
cin>>s;
addc(s);
}
int m;
cin>>m;
while (m--){
cin>>s;
switch(check(s)){
case 0:
cout<<"WRONG";break;
case 1:
cout<<"OK";break;
case 2:
cout<<"REPEAT";
}
cout<<'\n';
}
return 0;
}