hdu3065 ac自动机

傻逼多组测试,想了很久不知道为什么wa,结果是多组测试

ac自动机很多时候就是对End数组的操作,这题是用End数组记录末尾的字符串,query的时候sum综合一下End数组

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=50000+10,maxn=60000+10,inf=0x3f3f3f;

int sum[1000+10];
struct Trie{
    int tot,root,End[N];
    int Next[N][95],fail[N];
    int newnode()
    {
        for(int i=0;i<95;i++)
            Next[tot][i]=-1;
        End[tot]=0;
        return tot++;
    }
    void init()
    {
        tot=0;
        root=newnode();
        memset(sum,0,sizeof sum);
    }
    void insertstring(char *s,int k)
    {
        int now=root,len=strlen(s);
        for(int i=0;i<len;i++)
        {
            if(Next[now][s[i]-' ']==-1)
                Next[now][s[i]-' ']=newnode();
            now=Next[now][s[i]-' '];
        }
        End[now]=k;
    }
    void build()
    {
        queue<int>q;
        fail[root]=root;
        for(int i=0;i<95;i++)
        {
            if(Next[root][i]==-1)Next[root][i]=root;
            else
            {
                fail[Next[root][i]]=root;
                q.push(Next[root][i]);
            }
        }
        while(!q.empty())
        {
            int now=q.front();
            q.pop();
            for(int i=0;i<95;i++)
            {
                if(Next[now][i]==-1)Next[now][i]=Next[fail[now]][i];
                else
                {
                    fail[Next[now][i]]=Next[fail[now]][i];
                    q.push(Next[now][i]);
                }
            }
        }
    }
    void query(char *s)
    {
        int now=root,len=strlen(s);
        for(int i=0;i<len;i++)
        {
            now=Next[now][s[i]-' '];
            int temp=now;
            while(temp!=root)
            {
                sum[End[temp]]++;
                temp=fail[temp];
            }
        }
    }
};
Trie ac;
char a[1000+10][50+10];
char s[2000000+10];
int main()
{
    /*ios::sync_with_stdio(false);
    cin.tie(0);*/
    int n;
    while(~scanf("%d",&n))
    {
        ac.init();
        for(int i=1; i<=n; i++)
        {
            scanf("%s",&a[i]);
            ac.insertstring(a[i],i);
        }
        ac.build();
        getchar();
        char p;
        int cnt=0;
        memset(s,0,sizeof s);
        while((p=getchar())!='
')s[cnt++]=p;
        ac.query(s);
        for(int i=1; i<=n; i++)
        {
            if(sum[i]==0)continue;
            printf("%s: %d
",a[i],sum[i]);
        }
    }
    return 0;
}
/********************
3
AA
BB
C
ooxxCC%dA AAoen....END
********************/
View Code
原文地址:https://www.cnblogs.com/acjiumeng/p/7553390.html