程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3695 Computer Virus on Planet Pandora (AC自動機)

HDU 3695 Computer Virus on Planet Pandora (AC自動機)

編輯:C++入門知識



題意:有n種病毒序列(字符串),一個模式串,問這個字符串包含幾種病毒。


包含相反的病毒也算,字符串中[qx]表示有q個x字符。詳細見案列。


0 < q <= 5,000,000盡然不會超,無解睡覺

3
2
AB
DCB
DACB
3
ABC
CDE
GHI
ABCCDEFIHG
4
ABB
ACDEE
BBB
FEEE
A[2B]CD[4E]F

Sample Output
0
3
2
HintIn the second case in the sample input, the reverse of the program is ‘GHIFEDCCBA’, and ‘GHI’ is a substring of the reverse, so the program is infected 
by virus ‘GHI’.


#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int kind = 26;
const int maxn = 250*1000; //注意RE,單詞長度*單詞個數
const int M = 5100000;
struct node
{
    node *fail;
    node *next[kind];
    int count;
    node()
    {
        fail = NULL;
        count = 0;
        memset(next,0,sizeof(next));
    }
}*q[maxn];
char keyword[1010],str[M],str1[M];
int head,tail;
void insert(char *str,node *root)
{
    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++;
}

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<26;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 query(node *root)
{
    int i=0,cnt=0,index,len=strlen(str);
    node *p=root;
    while(str[i])
    {
        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&&temp->count!=-1)//沿失配邊走,走過的不走
		{
            cnt+=temp->count;
            temp->count=-1;
            temp=temp->fail;
        }
        i++;
    }
    return cnt;
}

int value(int p,int q)  
{  
    int i,ans=0,w=1;  
    for (i=q;i>=p;i--)  
    {  
        ans+=(str1[i]-'0')*w;  
        w*=10;  
    }  
  
    return ans;  
}  
int main()
{
    int n,t;
    scanf("%d",&t);
    while(t--)
    {
        head=tail=0;
        node *root = new node();
        scanf("%d",&n);
        while(n--)
        {
            scanf("%s",keyword);
            insert(keyword,root);
        }
        build_ac(root);
        scanf("%s",str1);
		int l=strlen(str1),i,j,k;  
  
        j=0;  
        for (i=0;i=i+1;l--)  
				{  
					v+=(str1[l]-'0')*w;  
					w*=10;  
				}  */
				int v=0;
				i++;
				while(str1[i]>='0'&&str1[i]<='9')
				{
					v=v*10+str1[i]-'0';
					i++;
				}
                for (int k1=1;k1<=v;k1++) str[j++]=str1[i];  
  
                i+=2; 
            }  
        }  
        str[j]='\0';  
        //printf("%s\n",str);  
  
        int h=query(root);  
        char chh;  
  
        l=strlen(str);  
        for (i=0;i<=(l-1)/2;i++)  
        {  
            chh=str[l-i-1];  
            str[l-i-1]=str[i];  
            str[i]=chh;  
        }  
        //printf("%s",str);  
        h+=query(root);  
        printf("%d\n",h);  
    }
    return 0;
}
/*
3
2
AB
DCB
DACB
3
ABC
CDE
GHI
ABCCDEFIHG
4
ABB
ACDEE
BBB
FEEE
A[2B]CD[4E]F
*/


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved