字典树

来源:互联网 发布:淘宝聚划算怎么抢最快 编辑:程序博客网 时间:2024/06/05 08:56

字典树

题目描述

遇到单词不认识怎么办? 查字典啊,已知字典中有n个单词,假设单词都是由小写字母组成。现有m个不认识的单词,询问这m个单词是否出现在字典中。

输入

含有多组测试用例。
第一行输入n,m (n>=0&&n<=100000&&m>=0&&m<=100000)分别是字典中存在的n个单词和要查询的m个单词.
紧跟着n行,代表字典中存在的单词。
然后m行,要查询的m个单词
n=0&&m=0 程序结束
数据保证所有的单词都是有小写字母组成,并且长度不超过10

输出

若存在则输出Yes,不存在输出No .

示例输入

3 2aabaaadacad0 0

示例输出

NoYes
久违的字典树,建立,插入,查找。。。。

#include <bits/stdc++.h>using namespace std;struct node{    int mark;    int next[26];} pp[500010];int root,top;char a[50],b[50];int creat(){    memset(pp[top].next,-1,sizeof(pp[top].next));    pp[top].mark=0;    return top++;}int xian(char c){    return c-'a';}void insert(int root,char *s){    int i;    int len =strlen(s);    for(i=0; i<len; i++)    {        if(pp[root].next[xian(s[i])]==-1)            pp[root].next[xian(s[i])]=creat();            root=pp[root].next[xian(s[i])];    }    pp[root].mark=1;}int search(int root,char *s){    int i;    int len=strlen(s);    for(i=0; i<len; i++)    {        if(pp[root].next[xian(s[i])]==-1)            return 0;        root=pp[root].next[xian(s[i])];    }    return pp[root].mark;}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)&&n&&m)    {        top=0;        root=creat();        for(int i=0; i<n; i++)        {            scanf("%s",a);            insert(root,a);        }        for(int i=0; i<m; i++)        {            scanf("%s",b);            if(search(root,b))                printf("Yes\n");            else printf("No\n");        }    }}<pre name="code" class="cpp">#include <bits/stdc++.h>  using namespace std;  struct node  {      int flag;      int next[26];  } sh[500005];  int a;  int creat()  {      memset(sh[a].next,0,sizeof(sh[a].next));      sh[a].flag=0;      return a++;  }  int insert(int root,char *str)  {      int i,len,t;      len=strlen(str);      for(i=0; i<len; i++)      {          t=str[i]-'a';          if(sh[root].next[t]==0)              sh[root].next[t]=creat();          root=sh[root].next[t];      }      return sh[root].flag=1;  }  int search(int root,char *str)  {      int i,len,t;      len=strlen(str);      for(i=0; i<len; i++)      {          t=str[i]-'a';          if(sh[root].next[t]==0)              return 0;          root=sh[root].next[t];      }      return sh[root].flag;  }  int main()  {      int n,m,i,root;      char str[10];      while(~scanf("%d%d",&n,&m))      {          if(n==0&&m==0)              break;          a=0;          root=creat();          for(i=0; i<n; i++)          {              scanf("%s",str);              insert(root,str);          }          for(i=0; i<m; i++)          {              scanf("%s",str);              if(search(root,str)==0)                  printf("No\n");              else printf("Yes\n");          }      }      return 0;  }    

 

0 0
原创粉丝点击