hdu2896 Ac自动机
ac自动机模版题吧
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,ans,id[505],vis[105000]; char s[255],T[10005]; struct node{ int a[105000][128],fail[105000],danger[105000],sum,q[105000]; void insert(int x){ int k=0,L=strlen(s); for(int i=0;i<L;i++){ int now=s[i]; if(!a[k][now]) a[k][now]=++sum; k=a[k][now]; } danger[k]++; id[x]=k; } void get_fail(){ int head=0,tail=0; for(int i=0;i<128;i++){ int now=a[0][i]; if(now) q[tail++]=now; } while(head!=tail){ int x=q[head++]; for(int i=0;i<128;i++){ int now=a[x][i]; if(!now){a[x][i]=a[fail[x]][i]; continue;} q[tail++]=now; fail[now]=a[fail[x]][i]; } } } void push_ans(int x){ int L=strlen(T),k=0,f=0; memset(vis,0,sizeof(vis)); for(int i=0;i<L;i++){ int now=T[i]; k=a[k][now]; for(int j=k;j;j=fail[j]) if(danger[j]){vis[j]=1; f=1;} } if(!f) return ; ans++; printf("web %d:",x); for(int i=1;i<=n;i++) if(vis[id[i]]) printf(" %d",i); printf("\n"); } }node; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%s",s),node.insert(i); node.get_fail(); scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%s",T),node.push_ans(i); printf("total: %d\n",ans); return 0; }