洛谷P2580 于是他错误的点名开始了

沙茶

题目大意:m个询问,某个子串是否出现在n个字符串中,YES/NO,如果重复询问就REPEAT

题解:Trie树询问

代码:

//p2580
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 500009
using namespace std;

int n,cnt,q,v[maxn],vis[maxn],trie[maxn][26];
char s[maxn];

void insert(){
    int root=0,len=strlen(s);
    for(int i=0;i<len;i++){
        int id=s[i]-'a';
        if(trie[root][id]==0)trie[root][id]=++cnt;
        root=trie[root][id];
    }
    v[root]=1;
}

int find(){
    int root=0,len=strlen(s);
    for(int i=0;i<len;i++){
        int id=s[i]-'a';
        if(trie[root][id]==0)return -1;
        root=trie[root][id];
    }
    if(!v[root])return -1;
    vis[root]++;
    return vis[root];
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",s);
        insert();
    }
    scanf("%d",&q);
    for(int i=1;i<=q;i++){
        scanf("%s",s);
        int p=find();
        if(p==-1)printf("WRONG\n");
        else if(p==1)printf("OK\n");
        else printf("REPEAT\n");
    }
    return 0;
}
AC

 

posted @ 2017-10-19 19:30  ANhour  阅读(222)  评论(0编辑  收藏  举报