题目描述
给出一个有n个字符串的字典,然后有m个询问。每个询问给出一个字符串,问这个字符串是否在给出的字典当中。如果这个字符串存在于字典当中,则输出Yes,否则输出No
输入
第一行一个整数n(n<=1000000),表示字典的字符串数目
接下来n行,每行一个字符串s(其中s的长度不超过10,且仅由小写字母组成)
接下来一个整数m(m<=1000000),表示有m个询问
接下来有m行,每行一个字符串s(其中s的长度不超过10,且仅由小写字母组成)
输出
一共m行,对于每一个询问,如果字符串存在于字典当中,则输出Yes,否则输出No
样例输入
5
acfast
acslow
jzoj
oj
acm
4
acst
acfast
jzojj
jzoj
样例输出
No
Yes
No
Yes
数据范围限制
时间限制: 2000 ms 空间限制: 655360 KB
题解
此题可以用二分,也可以用字典树。
Code1:
#include<cstdio>
#include<string>
#include<cstring>
struct trie
{
int to[27];
bool bz;
}tree[1000001];
char s[1000];
int tot=1;
void insert()
{
scanf("%s",s+1);
int len=strlen(s+1);
int t=1;
for (int i=1;i<=len;i++)
{
int k=s[i]-'a'+1;
if (!tree[t].to[k]) tree[t].to[k]=++tot;
t=tree[t].to[k];
}
tree[t].bz=1;
}
bool find()
{
scanf("%s",s+1);
int len=strlen(s+1);
int t=1;
for (int i=1;i<=len;i++)
{
int k=s[i]-'a'+1;
t=tree[t].to[k];
if (t==0) break;
}
return tree[t].bz;
}
int main(){
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
insert();
int m;
scanf("%d",&m);
for (int i=1;i<=m;i++)
if (find())
printf("Yes\n");
else
printf("No\n");
return 0;
}
Code2:
var
ch:array[0..4000000,0..25]of longint;
bz:array[0..4000000]of boolean;
n,m,i,tot:longint;
s:string;
procedure insert(s:string;x,y:longint);
begin
if y>length(s) then
begin
bz[x]:=True;exit;
end;
if ch[x,ord(s[y])-97]=0 then
begin
inc(tot);ch[x,ord(s[y])-97]:=tot;
end;
insert(s,ch[x,ord(s[y])-97],y+1);
end;
function ask(s:string;x,y:longint):string;
begin
if y>length(s) then
begin
if bz[x] then exit('Yes')
else exit('No');
end;
if ch[x,ord(s[y])-97]>0 then
begin
exit(ask(s,ch[x,ord(s[y])-97],y+1));
end
else exit('No');
end;
begin
readln(n);bz[1]:=True;
for i:=1 to n do
begin
readln(s);insert(s,0,1);
end;
readln(m);
for i:=1 to m do
begin
readln(s);writeln(ask(s,0,1));
end;
end.
作者:zsjzliziyang
QQ:1634151125
转载及修改请注明
本文地址:https://blog.csdn.net/zsjzliziyang/article/details/81913558