题目大意:m个询问,某个子串是否出现在n个字符串中,YES/NO,如果重复询问就REPEAT
题解:Trie树询问
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//p2580 #include<iostream> #include<cstdio> #include<cstring> #define maxn 500009 using namespace std; int n,cnt,q,v[maxn],vis[maxn],trie[maxn][26]; char s[maxn]; void insert(){ int root=0,len=strlen(s); for(int i=0;i<len;i++){ int id=s[i]-'a'; if(trie[root][id]==0)trie[root][id]=++cnt; root=trie[root][id]; } v[root]=1; } int find(){ int root=0,len=strlen(s); for(int i=0;i<len;i++){ int id=s[i]-'a'; if(trie[root][id]==0)return -1; root=trie[root][id]; } if(!v[root])return -1; vis[root]++; return vis[root]; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s); insert(); } scanf("%d",&q); for(int i=1;i<=q;i++){ scanf("%s",s); int p=find(); if(p==-1)printf("WRONG "); else if(p==1)printf("OK "); else printf("REPEAT "); } return 0; }