codevs4189字典

沙茶

题目大意:求某一个字符串前缀有没有在n个字符串前缀里出现过

题解:Trie树 查询前缀有没有出现

代码:

//codevs4189
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 2000008
using namespace std;

int n,q,cnt,trie[maxn][30];
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];
    }
}

bool 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 false;
        root=trie[root][id];
    }
    return true;
}

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);
        if(find())printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
AC
posted @ 2017-10-19 19:23  ANhour  阅读(178)  评论(0编辑  收藏  举报