[HDU2896]病毒侵袭(AC自动机)

来源:互联网 发布:win7触摸屏校准软件 编辑:程序博客网 时间:2024/06/06 16:44

题目:

我是超链接

题解:

AC自动机模板题

代码:

#include <cstdio>#include <queue>#include <algorithm>#include <cstring>using namespace std;char st[10005];int tot=0,ch[100005][130],is_end[100005],fail[100005],ans[1005];bool vis[100005];void trie(int id){int i;scanf("%s",st);int l=strlen(st),now=0;for (i=0;i<l;i++){int x=st[i];if (!ch[now][x]) ch[now][x]=++tot;now=ch[now][x];}is_end[now]=id;}void sp(){int i;queue <int> q;for (i=0;i<=128;i++)  if (ch[0][i]) q.push(ch[0][i]);while (!q.empty()){int now=q.front();q.pop();for (i=0;i<=128;i++){if (!ch[now][i]){ch[now][i]=ch[fail[now]][i];continue;}fail[ch[now][i]]=ch[fail[now]][i];q.push(ch[now][i]);}}}void ac(){int i;scanf("%s",st);int l=strlen(st),now=0;    for (i=0;i<l;i++)    {    vis[now]=1;    int x=st[i];    int y=ch[now][x];    while (y && !vis[y])    {    vis[y]=1;    if (is_end[y]) ans[++ans[0]]=is_end[y];    y=fail[y];}now=ch[now][x];}}int main(){int n,i,j,m;scanf("%d",&n);for (i=1;i<=n;i++)  trie(i);sp();scanf("%d",&m);int tot=0;for (i=1;i<=m;i++){memset(ans,0,sizeof(ans));memset(vis,0,sizeof(vis));ac();if (ans[0]){printf("web %d:",i);sort(ans+1,ans+ans[0]+1);    for (j=1;j<=ans[0];j++)      printf(" %d",ans[j]);    printf("\n");    tot++;}}printf("total: %d",tot);}


0 0
原创粉丝点击