【CodeVS4189】字典

Description

最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000)

现在skyzhong需要在字典里查询以某一段字母开头的单词

如:skyzhong想查询a

那么只要是a开头的单词就可以了

skyzhong只想知道里面有没有这一个单词(因为没有他就不查了)

若有,请输出YES。若没有,请输出NO

Input

第一行一个数n

第二行到第n+1行,一行一个字符串

再下一行一个数m,表示skyzhong想要查询的次数

接着m行,一行一个字符串,表示skyzhong想要查的东西

Output

共m行,若有这字串输出YES,否则输出NO

Sample Input

3

asd

asfdghj

asfd

3

asd

asdghj

asf

Sample Output

YES

NO

YES

HINT

字符串只有小写字母,且长度≤8

题解

trie树

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 500010
using namespace std;
struct node
{
    int next[26];
}trie[N];
char s[10];
int topt;
void add_trie()
{
    int l=strlen(s),now = 0;
    for (int i=0;i<l;i++)
    {
        int x = s[i]-'a'+1;
        if (trie[now].next[x])
            now = trie[now].next[x];
        else
        {
            trie[now].next[x] = ++topt;
            now = topt;
        }
    }
}
int find()
{
    int l=strlen(s);
    int now = 0,p = 0,sum = 0;
    while (p < l)
    {
        if (!trie[now].next[s[p]-'a'+1])
            return 0;
        else 
        {
            now = trie[now].next[s[p]-'a'+1];
            p++;
        }
    }
    return 1;
}
int main()
{
    int n,m;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>s;
        add_trie();
    }
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
    {
        cin>>s;
        if (find()) printf("YES\n");
            else printf("NO\n");
    }
}

 

posted @ 2016-05-07 14:37  mengyue  阅读(250)  评论(0编辑  收藏  举报