【hdu2896】病毒侵袭

来源:互联网 发布:java io 实现断点续传 编辑:程序博客网 时间:2024/06/05 03:34

我的内心几乎是崩溃!!
AC自动机模板题
一开始给每个叶子开了26个儿子,后来RE了,发现没有规定必须是小写字母,然后改成130,突然觉得这道题卡内存啊,写完之后果真MLE了,看了别人的博客发现跟我开同样大的数组大小没有事,猛然想到去掉memset这样的话只会有100000个结点,所以不会MLE。
此时大概已经这道题已经写了40分钟左右了,然后我就开始崩溃了,自测各种数据不出错,交上去不停WA,于是搜到了zyf2000的博客,照着她的程序改,= =本来我AC自动机的模板就是找着她打的而且码风和她很像(大括号换行嘿嘿,zyz是不换行的异端),直到改到和她变量名不同,其他完全相同的时候,还是在WA,我想难道有不规范的关键字,然后又交了一遍,忽然想到是不是输出的单词的问题,整个人都懵逼了,赶快检查自己的程序,web没有问题啊,total!!!!我简直想抽自己一巴掌,于是这道题写了整整两个小时,整个人都不好了,蓝瘦,日了假狗(捂脸)。
贴上改到和zyf2000基本完全相同的代码。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int N=100005;int ch[N][130],n,m,sz,fl[N],ed[N],cnt,ans[N];bool vis[N];char s[N];queue<int>q;void insert(int id){    int len=strlen(s),now=0;    for (int i=0;i<len;++i)    {        int x=s[i];        if (!ch[now][x])ch[now][x]=++sz;        now=ch[now][x];    }    ed[now]=id;}void make_fail(){    while(!q.empty()) q.pop();    for (int i=0;i<=128;++i)    if (ch[0][i])q.push(ch[0][i]);    while(!q.empty())    {        int now=q.front();q.pop();        for (int i=0;i<=128;++i)        {            if (!ch[now][i])            {                ch[now][i]=ch[fl[now]][i];                continue;            }            fl[ch[now][i]]=ch[fl[now]][i];            q.push(ch[now][i]);        }    }}void ac(){    int len=strlen(s),now=0;    for (int i=0;i<len;++i)    {        vis[now]=1;        int x=s[i];         int y=ch[now][x];        while (y&&!vis[y])        {            vis[y]=1;            if (ed[y])ans[++ans[0]]=ed[y];            y=fl[y];        }        now=ch[now][x];    }}int main(){    scanf("%d\n",&n);    for (int i=1;i<=n;++i)    {        gets(s);        insert(i);    }    scanf("%d\n",&m);    make_fail();    for (int j=1;j<=m;++j)    {        gets(s);        ans[0]=0;        memset(vis,0,sizeof(vis));        ac();           if (ans[0])        {            printf("web %d: ",j);            sort(ans+1,ans+ans[0]+1);            for (int i=1;i<=ans[0];++i)            printf("%d%c",ans[i]," \n"[i==ans[0]]);            ++cnt;        }    }    printf("total: %d\n",cnt);}
0 0
原创粉丝点击