1099. 寻找字符串

题目描述

给出一个有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

猜你喜欢

转载自blog.csdn.net/zsjzliziyang/article/details/81913558