Trie——Luogu3879 [TJOI2010]阅读理解

来源:互联网 发布:python能干嘛 编辑:程序博客网 时间:2024/05/20 18:53

题面:Luogu3879
一开始我感觉好像可以用set搞一搞的
然后发现迭代器我实在不太会用。。。
而且到底set怎么存我也不大有数
后来想了想,还是Trie靠谱
就是在结束标记记录一下这里有多少文章有这个单词就好了
感觉set原理也是一样的

#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <iostream>#include <ctime>#include <map>#include <queue>#include <cstdlib>#include <string>#include <climits>#include <set>#include <vector>using namespace std;inline int read(){    int k=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){k=k*10+ch-'0';ch=getchar();}    return k*f;}char s[10010];int nex[500010][26],n,cnt=0;bool b[500010][110];inline void insert(int x){    scanf("%s",s+1);int l=strlen(s+1);    int now=0;    for(int i=1;i<=l;i++){        int p=s[i]-'a';        if(!nex[now][p])nex[now][p]=++cnt;        now=nex[now][p];    }    b[now][x]=1;}inline void check(){    scanf("%s",s+1);int l=strlen(s+1);    int now=0,flag=1;    for(int i=1;i<=l;i++){        int p=s[i]-'a';        if(!nex[now][p]){flag=0;break;}        now=nex[now][p];    }    if(flag)for(int i=1;i<=n;i++)if(b[now][i])printf("%d ",i);    puts("");}int main(){    n=read();    for(int i=1;i<=n;i++){        int x=read();        for(int j=1;j<=x;j++)insert(i);    }    int m=read();    for(int i=1;i<=m;i++)check();    return 0;}
原创粉丝点击