题目
模板及讲解
输入两个整数m,n(m,n<=10),分别代表字典里有m个字符串和有n个查询
接下来m行输入m行字符串,每个字符串长度不超过255,且均为小写字母
接下来n行输入n行询问,如果询问的字符串在字典里,输出1,否则输出0
输入样例
6 4
apple
app
appdl
byu
byuy
ew
app
ew
byyy
appdl
输出样例
1
1
0
1
#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;
}