题解 P2580 【于是他错误的点名开始了】

· · 题解

可以算是模版了

#include<iomanip>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=10000*50+7;
int n,m,trie[maxn][26],rt=1,cnt=1,mark[maxn];char s[55];
void Insert(int &x,int now,int len)
{
    if(!x) x=++cnt;
    if(now==len)  mark[x]=1;
    else Insert(trie[x][s[now]-'a'],now+1,len);
}
int my_find(int x,int now,int len)
{
    if(now==len)
    {
        if(++mark[x]==1) {mark[x]--;return 0;}
        else if(mark[x]==2) return 1;
        else return -1; 
    }
    else return my_find(trie[x][s[now]-'a'],now+1,len);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%s",s);int len=strlen(s);
        Insert(rt,0,len);
    }
    scanf("%d",&m);
    for(int i=1;i<=m;++i)
    {
        scanf("%s",s);int len=strlen(s);
        int k=my_find(rt,0,len);
        if(!k) printf("WRONG\n");
        else printf((k<0)?"REPEAT\n":"OK\n");
    }
    return 0;
}