zoukankan      html  css  js  c++  java
  • HDU 3065 病毒在继续 (AC自己主动机)


    中国标题不解释

    Sample Input
    3 AA BB CC ooxxCC%dAAAoen....END
     

    Sample Output
    AA: 2 CC: 1
    输出病毒出现的次数!


    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int kind = 26;
    const int M = 1005;
    struct node
    {
    	node *fail;
    	node *next[kind];
    	int count;
    	node()
    	{
    		fail = NULL;
    		count = 0;
    		memset(next,0,sizeof(next));
    	}
    }*q[50*M];
    char keyword[1005][55],str[2000010];
    int head,tail;
    void insert(char *str,node *root,int num)
    {
    	node *p=root;
    	int i=0,index;
    	while(str[i])
    	{
    		index = str[i] - 'A';
    		if(p->next[index]==NULL)
    			p->next[index] = new node();
    		p = p->next[index];
    		i++;
    	}
    	p->count=num;
    }
    
    void build_ac(node *root)
    {
    	int i;
    	root->fail=NULL;
    	q[head++]=root;
    	while(head!=tail)
    	{
    		node *temp = q[tail++];
    		node *p=NULL;
    		for(i=0;i<kind;i++)
    		{
    			if(temp->next[i]!=NULL)
    			{
    				if(temp==root)	
    					temp->next[i]->fail=root;//失败指针指向root
    				else 
    				{
    					p = temp->fail;
    					while(p!=NULL)
    					{
    						if(p->next[i]!=NULL)
    						{
    							temp->next[i]->fail=p->next[i];
    							break;
    						}
    						p=p->fail;
    					}
    					if(p==NULL)
    						temp->next[i]->fail=root;
    				}
    				q[head++]=temp->next[i];
    			}
    		}
    	}
    }
    int vis[1005];
    void query(char *str,node *root)
    {
    	int i=0,cnt=0,index,len=strlen(str);
    	node *p=root;
    	while(str[i])
    	{
    		if(str[i]<'A'||str[i]>'Z')
    		{
    			p=root;
    			i++;
    			continue;
    			
    		}
    		index = str[i]-'A';
    		while(p->next[index]==NULL&&p!=root)
    			p = p->fail;
    		p=p->next[index];
    		p=(p==NULL)?root:p;
    		node *temp = p;
    		while(temp!=root)
    		{
    			vis[temp->count]++;
    			temp=temp->fail;
    		}
    		i++;
    	}
    }
    
    int main()
    {
    	int n,m;
    	while(~scanf("%d",&n))
    	{
    		head=tail=0;
    		node *root = new node();
    		getchar();
    		for(int i=1;i<=n;i++)
    		{
    			gets(keyword[i]);
    			insert(keyword[i],root,i);
    		}
    		build_ac(root);
    		scanf("%s",str);
    		memset(vis,0,sizeof(vis));
    		query(str,root);
    		for(int i=1;i<=n;i++)
    			if(vis[i])
    				printf("%s: %d
    ",keyword[i],vis[i]);
    	}
    	return 0;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
    在执行Action之间检验是否登录
    链接服务器使用方法
    easyui-treegrid节点选择
    SQLServer 存储过程详解
    转载:SQL Server编程基本语法
    【转】SQL Server编程游标
    机器学习14—SVD学习笔记
    机器学习13—PCA学习笔记
    FP Tree算法原理总结(转载)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4656299.html
Copyright © 2011-2022 走看看