codevs4189字典(字典树)

/*
本字典树较弱 只支持插入单词 查询单词.
特殊的 bool变量w 标记此字母是不是某个单词的结束
(然而这个题并没卵用) 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 300010
#define maxm 1010
using namespace std;
char s[maxm];
struct node
{
    int next[27];
    bool w;
}tire[maxn];
int n,m,topt;
void Add_tire()
{
    int l=strlen(s);
    int now=0;
    for(int i=0;i<l;i++)
      {
          int x=s[i]-'a'+1;
          if(tire[now].next[x])
          now=tire[now].next[x];
          else 
          {
              ++topt;
              tire[now].next[x]=topt;
              now=topt;
          }
      }
    tire[now].w=1;
}
int find()
{
    int len=strlen(s);
    int now=0,p=0,sum=0;
    while(p<=len-1)
      {
          if(tire[now].next[s[p]-'a'+1])
            {
              now=tire[now].next[s[p]-'a'+1];
            p++;
            continue;
          }
        return 0;
      }
    //if(!tire[now].w)return 0;
    return 1;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
      {
          scanf("%s",s);
        Add_tire();
      }
    cin>>m;
    memset(s,0,sizeof(s));
    for(int i=1;i<=m;i++)
      {
          scanf("%s",s);
          int bo=find();
        if(bo)printf("YES\n");
        else printf("NO\n");
      } 
    return 0;
}

 

posted @ 2016-05-05 21:59  一入OI深似海  阅读(184)  评论(0编辑  收藏  举报