传送门
仔细看一下题目,事实上就是字典树的模板题,对于insert操作和search操作进行一下微调就可以了。主要的调整是,附加信息不在insert操作里面插入,而是在search操作中插入
在本题中,附加信息为该字符串是不是第一次被询问。
code:
#include <cstdio>
#include <cstring>
#define ll int
#define inf 1<<30
#define mt(x,y) memset(x,y,sizeof(x))
#define il inline
il ll max(ll x,ll y){return x>y?x:y;}
il ll min(ll x,ll y){return x<y?x:y;}
il ll abs(ll x){return x>0?x:-x;}
il void swap(ll &x,ll &y){ll t=x;x=y;y=t;}
il void read(ll &x){//快读
x=0;ll f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
x*=f;
}
using namespace std;
#define N 500010
struct Trie{
ll val[N],ch[N][26],sz;
Trie(){
sz=1;
memset(ch[0],0,sizeof(ch[0]));
memset(val,0,sizeof(val));
}
ll idx(char c){return c-'a';}
void insert(char *s){
ll u=0,len=strlen(s+1);
for(ll i=1;i<=len;i++){
ll c=idx(s[i]);
if(!ch[u][c]){
memset(ch[sz],0,sizeof(ch[sz]));
ch[u][c]=sz++;
}
u=ch[u][c];
}
}
ll search(char *s){
ll u=0,len=strlen(s+1);
for(ll i=1;i<=len;i++){
ll c=idx(s[i]);
if(!ch[u][c])return 0;
u=ch[u][c];
}
if(!val[u]){
val[u]=1;return 1;
}
return 2;
}
}tree;
ll n,m;
int main(){
read(n);char s[100];
for(ll i=1;i<=n;i++){
scanf("%s",s+1);
tree.insert(s);
}
read(m);
for(ll i=1;i<=m;i++){
scanf("%s",s+1);
ll pd=tree.search(s);
if(pd==0)printf("WRONG\n");
else if(pd==1)printf("OK\n");
else if(pd==2)printf("REPEAT\n");
}
return 0;
}