|算法讨论|Trie树 学习笔记

来源:互联网 发布:金川公司网络学校 编辑:程序博客网 时间:2024/06/10 17:47

题目


模板及讲解

输入两个整数m,n(m,n<=10),分别代表字典里有m个字符串和有n个查询
接下来m行输入m行字符串,每个字符串长度不超过255,且均为小写字母
接下来n行输入n行询问,如果询问的字符串在字典里,输出1,否则输出0

输入样例

6 4appleappappdlbyubyuyewappewbyyyappdl

输出样例

1101
#include<cstdio>  #include<algorithm>  #include<cstring>  #include<vector>  #include<string>  #define ms(i,j) memset(i,j, sizeof i);  using namespace std;  int c[2600][26];//Trie   int p[2600];//标记值,为0则是终点   int m,n;  int sz = 0;  int insert(char *s)  {      int u = 0;//当前节点       int l = strlen(s);      for (int i=0;i<l;i++)      {          int ch = s[i]-'a';          if (c[u][ch]==0)//没有这个节点           {              c[u][ch] = ++sz;//创造这个节点               u = c[u][ch];          }else//向下走           {              u = c[u][ch];          }      }      p[u] = 0;  }  int check(char *s)  {      int u = 0;//当前节点       int l = strlen(s);      for (int i=0;i<l;i++)      {          int ch = s[i]-'a';          if (c[u][ch]==0)//没有这个节点那么肯定这个查询不存在           {              return false;          }else//向下走           {              u = c[u][ch];          }      }      if (p[u]==0) return true;//有结束标记的才是存在的       return false;  }  int main()  {      ms(c,0);//初始化Trie       ms(p,-1);       scanf("%d%d\n", &m ,&n);      for (int i=1;i<=m;i++)      {          char ch[300];          scanf("%s", ch);          insert(ch);      }      for (int i=1;i<=n;i++)         {          char ch[300];          scanf("%s", ch);          if(check(ch)) printf("1\n");          else printf("0\n");      }       return 0;  }  
0 0
原创粉丝点击