题目描述
最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000)
现在skyzhong需要在字典里查询以某一段字母开头的单词
如:skyzhong想查询a
那么只要是a开头的单词就可以了
skyzhong只想知道里面有没有这一个单词(因为没有他就不查了)
若有,请输出YES。若没有,请输出NO
输入描述
第一行一个数n
第二行到第n+1行,一行一个字符串
再下一行一个数m,表示skyzhong想要查询的次数
接着m行,一行一个字符串,表示skyzhong想要查的东西
输出描述
共m行,若有这字串输出YES,否则输出NO
样例输入
3
asd
asfdghj
asfd
3
asd
asdghj
asf
样例输出
YES
NO
YES
数据范围及提示
字符串只有小写字母,且长度≤8
建26个树,每个树代表了一个字母的起头(a~z)
每个根节点下面有26个叶子节点(a~z) 虽然这么说 但是如果没有的话也就不需要建立
如果这个节点有数就给他一个编号 没有数就空着 为0
查询时找到起点一直往下查,如果有一个点为0 那么代表这个树上没有这个单词 输出NO 否则输出YES
#include<bits/stdc++.h>
using namespace std;
string x;
int tree[2000005][30];
int n,m,cnt;
void insert(string s,int t)
{
int q=s.length();
for(int i=0;i<q;i++)
{
int x=s[i]-'a';
if(tree[t][x]==0)//如果这个数没插进去在第t个位置上没有x这个数
{
tree[t][x]=++cnt;//给他一个编号,代表已经插了进去
}
t=tree[t][x];//查看下一个数
}
return ;
}
bool find(string s,int t)
{
int q=s.length();
for(int i=0;i<q;i++)
{
int x=s[i]-'a';
if(tree[t][x]==0) return 0;//如果这个数 树上没有 代表没有这个单词
t=tree[t][x];//查看下一个数
}
return 1;
}
int main()
{
cin>>n;
while(n--)
{
cin>>x;
insert(x,0);//建树
}
cin>>m;
while(m--)
{
cin>>x;
if(find(x,0)) printf("YES\n");
else printf("NO\n");
}
return 0;
}