zoukankan      html  css  js  c++  java
  • 病毒侵袭 HDU

    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=1e5+10;
    int tr[N][130],n,m,idx,ne[N],ed[N],cnt,cas=1;
    int vis[N];
    char str[N];
    void insert(char str[],int id)
    {
    	int len=strlen(str),now=0;
        for(int i=0;i<len;i++)
        {
            int x=str[i];
            if(!tr[now][x])
                tr[now][x]=++idx;
            now=tr[now][x];
        }
        //在病毒尾部加编号 
        ed[now]=id;
    }
    void build()
    {
        queue<int>q;
        while(q.size())
            q.pop();
        for(int i=0;i<=128;i++)
            if(tr[0][i])
                q.push(tr[0][i]);
        while(q.size())
        {
            int now=q.front();
            q.pop();
            for(int i=0;i<=128;i++)
            {
                if(!tr[now][i])
                {
                    tr[now][i]=tr[ne[now]][i];
                    continue;
                }
                ne[tr[now][i]]=tr[ne[now]][i];
                q.push(tr[now][i]);
            }
        }
    }
    void query(char str[])
    {
        int use[510]={0};
        int len=strlen(str);
        int now=0,flag=0;
        for(int i=0;i<len;i++)
        {
            vis[now]=1;
            int x=str[i];
            int y=tr[now][x];
            while(y&&!vis[y])//只查找一次,所以要标记y
            {
                vis[y]=1;
                if(ed[y])
                {
                    use[ed[y]]=1;
                    flag=1;
                }
                y=ne[y];
            }
            now=tr[now][x];
        }
        if(flag)
        {
            printf("web %d:",cas);
            //输出用过的编号 
            for(int i=0;i<510;i++)
                if(use[i]==1)
                    printf(" %d",i);
            cnt++;
            printf("
    ");
        }
    }
    int main() {
    	
    	idx = 0;
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i ++ ) {
    		scanf("%s", &str);
    		insert(str,i);
    	}
    	cin>>m;
    	build();
    	for(int i=1;i<=m;i++)
        {
            scanf("%s",&str);
            memset(vis,0,sizeof(vis));//查询下一个文本,需要重置vis标记
            query(str);
            cas++;
        }
    	printf("total: %d
    ",cnt);
    	return 0;
    }
    
  • 相关阅读:
    信协第一学期考核
    20175323《Java程序设计》第五周学习总结
    20175323《Java程序设计》第四周学习总结
    20175323《Java程序设计》第三周学习总结
    20175323《Java程序设计》第二周学习总结
    20175323 第一周学习总结
    第一次个人编程作业
    第一次博客作业
    团队项目-选题报告
    第一次结对编程作业
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12523317.html
Copyright © 2011-2022 走看看