• AC日记——病毒侵袭 hdu 2896


    2896

    思路:

      好题;

    代码:

    #include <queue>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    #define maxn 100001
    
    int ne[60005][130],tag[60005],fail[60005],n,tot,m,ans;
    
    char ch[maxn];
    
    bool vis[60005],out,sc[505];
    
    queue<int>que;
    
    int main()
    {
        int i,j,len,now,temp;
        scanf("%d",&n);
        tot=1,ans=0;getchar();
        for(i=1;i<=n;i++)
        {
            gets(ch);
            len=strlen(ch);
            now=1;
            for(j=0;j<len;j++)
            {
                if(!ne[now][ch[j]]) ne[now][ch[j]]=++tot;
                now=ne[now][ch[j]];
            }
            tag[now]=i;
        }
        que.push(1);
        while(!que.empty())
        {
            now=que.front();que.pop();
            for(i=0;i<130;i++)
            {
                if(!ne[now][i]) continue;
                if(now==1) fail[ne[now][i]]=now;
                else
                {
                    temp=fail[now];
                    while(temp)
                    {
                        if(ne[temp][i])
                        {
                            fail[ne[now][i]]=ne[temp][i];
                            break;
                        }
                        temp=fail[temp];
                    }
                    if(!temp) fail[ne[now][i]]=1;
                }
                que.push(ne[now][i]);
            }
        }
        scanf("%d",&m);getchar();
        for(i=1;i<=m;i++)
        {
            out=false;
            for(j=0;j<=n;j++) sc[j]=false;
            for(j=0;j<60005;j++) vis[j]=false;
            gets(ch);
            len=strlen(ch),now=1;
            for(j=0;j<len;j++)
            {
                if(ne[now][ch[j]]) now=ne[now][ch[j]];
                else
                {
                    temp=fail[now];
                    while(temp)
                    {
                        if(ne[temp][ch[j]])
                        {
                            now=ne[temp][ch[j]];
                            break;
                        }
                        temp=fail[temp];
                    }
                    if(!temp) now=1;
                }
                temp=now;
                while(!vis[temp])
                {
                    vis[temp]=true;
                    if(!sc[tag[temp]]&&tag[temp]) out=true,sc[tag[temp]]=true;
                    temp=fail[temp];
                }
            }
            if(out)
            {
                printf("web %d:",i);
                   for(j=0;j<=n;j++) if(sc[j]) printf(" %d",j);
                  printf("
    "),ans++;
            }
        }
        printf("total: %d
    ",ans);
        return 0;
    }
  • 相关阅读:
    又见回文 字符串
    学密码学一定得学程序 KMP
    学密码学一定得学程序 KMP
    KMP简单应用
    KMP简单应用
    用ALAssetsLibrary将过滤后图片写入照片库
    iOS 8版本信息与屏幕尺寸
    屏幕适配的那些坑
    从工程中删除Cocoapods
    AVCaptureSession 照相时获取 AVCaptureVideoPreviewLayer尺寸
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6859775.html
Copyright © 2020-2023  润新知