ac自動機 hud2222

hdu2222

詳細解釋 請見 解釋

#include<bits/stdc++.h>
#define inf  0x7fffffff
#define linf 0x7fffffffffffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define fup(i,x,y) for(int i=(x);i<=(y);i++)
#define fdn(i,x,y) for(int i=(x);i>=(y);i--)
#define sp(x) setprecision(x)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define sc(n) scanf("%s",n)
#define lowbit(x) (x&(-x))
#define pf(x) printf("%d\n",x)
#define pfl(x) printf("%lld\n",x)
#define pff(x) printf("%lf\n",x)
#define debug printf("!!\n");
#define N 1000005
#define M 4000009
#define pi acos(-1)
#define eps 1e-2
//cout.setf(ios::fixed);
//freopen("out.txt","w",stdout);// freopen("in.txt","r",stdin);
using namespace std;
typedef long long  ll;
typedef double db;
using namespace std;
typedef long long ll;
const int maxn = 5e5+10;
const int sz=4;
int ne[maxn][30],fail[maxn],ed[maxn];
int tot;
void init()
{
    mem(ne,0);
    mem(ed,0);
    tot=0;
}
void add(char *k)
{
    int len=strlen(k),r=0;
    fup(i,0,len-1)
    {
        int id=k[i]-'a';
        if(!ne[r][id]) ne[r][id]=++tot;
        r=ne[r][id];
    }
    ed[r]++;
}
void buildfail()
{
    queue<int> q;
    int r=0;
    fup(i,0,25)
    {
        if(ne[r][i])
        {
            fail[ne[r][i]]=0;
            q.push(ne[r][i]);
        }
    }
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        fup(i,0,25)
        {
            if(ne[now][i])
            {
                fail[ne[now][i]]=ne[fail[now]][i];
                q.push(ne[now][i]);
            }
            else ne[now][i]=ne[fail[now]][i];
        }
    }
}
int query(char *k)
{
    int len=strlen(k),now=0;
    int ans=0;
    fup(i,0,len-1)
    {
        int id=k[i]-'a';
        now=ne[now][id];
        int tp=now;
        while(tp)
        {
            ans+=ed[tp];
            ed[tp]=0;
            tp=fail[tp];
        }
    }
    return ans;
}
char s1[1000010];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        init();
        for(int i=0;i<n;i++)
        {
            scanf("%s",s1);
            add(s1);
        }
        buildfail();
        scanf("%s",s1);
        printf("%d\n",query(s1));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章