题:http://acm.hdu.edu.cn/showproblem.php?pid=2896
分析:ac自动机模板
注意细节,1、128个ascii码都要;
2、只要关键码含有只输出一个编号就行;
#include<iostream> #include<queue> #include<algorithm> #include<cstring> #include<string> using namespace std; typedef long long ll; #define pb push_back const int M=1e5+6; int trie[M][128]; int cntword[M]; int fail[M],id[M]; int cnt=0; int vis[1002]; void insert(int x,string s){ int root=0; for(int i=0;i<s.size();i++){ if(!trie[root][s[i]]) trie[root][s[i]]=++cnt; root=trie[root][s[i]]; }id[root]=x; cntword[root]++; } void getfail(){ queue<int>que; while(!que.empty()) que.pop(); for(int i=0;i<128;i++){ if(trie[0][i]){ fail[trie[0][i]]=0; que.push(trie[0][i]); } } while(!que.empty()){ int now=que.front(); que.pop(); for(int i=0;i<128;i++){ if(trie[now][i]){ fail[trie[now][i]]=trie[fail[now]][i]; que.push(trie[now][i]); } else trie[now][i]=trie[fail[now]][i]; } } } int query(string s,int x){ int num=0; int now=0; for(int i=0;i<s.size();i++){ now=trie[now][s[i]]; for(int j=now;j;j=fail[j]){ num+=cntword[j]; // cntword[j]=-1; if(id[j]) vis[id[j]]=1; /// b[x].push_back(id[j]); } } return num; } int main(){ int n; ios::sync_with_stdio(false); cin.tie(0); cin>>n; string s; for(int i=1;i<=n;i++){ cin>>s; insert(i,s); } fail[0]=0; getfail(); int m; int ans=0; cin>>m; for(int i=1;i<=m;i++){ cin>>s; memset(vis,0,sizeof(vis)); if(query(s,i)>=1){ cout<<"web "<<i<<":"; for(int j=1;j<=n;j++){ if(vis[j]) cout<<‘ ‘<<j; } cout<<‘\n‘; ans++; } } cout<<"total: "<<ans<<‘\n‘; return 0; }
原文:https://www.cnblogs.com/starve/p/12266868.html