[HDU2222]Keywords Search(AC自动机)

本文详细介绍了AC自动机的实现原理及其在字符串匹配问题中的应用。通过具体的代码示例,展示了如何构建AC自动机并利用其进行高效模式匹配。特别针对多模式匹配问题提供了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[不稳定的传送门]

Solution

真的是模版

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 500010
using namespace std;
 
char s[N*2];
int n,cas,T[N][27],fail[N],q[N],tot,h,t,num[N];
 
inline void Insert(){
    scanf("%s",s);
    int len=strlen(s),now=1;
    for(int i=0;i<len;++i){
        if(!T[now][s[i]-96]) T[now][s[i]-96]=++tot;
        now=T[now][s[i]-96];
    }
    num[now]++;
}
 
inline void getfail(){
    int k,now;
    for(int i=1;i<=26;++i) T[0][i]=1;
    h=0,t=1;q[1]=1;
    while(h<t){
        now=q[++h];
        for(int i=1;i<=26;++i)
            if(T[now][i]){
                k=fail[now];
                while(!T[k][i]) k=fail[k];
                fail[q[++t]=T[now][i]]=T[k][i];
            }else T[now][i]=T[fail[now]][i];
    }
}

inline void Init(){
    memset(T,0,sizeof(T));
    memset(fail,0,sizeof(fail));
    memset(num,0,sizeof(num));
    tot=1;
}
 
int calc(){
    scanf("%s",s);
    int len=strlen(s),now=1,res=0;
    for(int i=0;i<len;++i){
        now=T[now][s[i]-96];
        int tmp=now;
        while(tmp){
            res+=num[tmp];
            num[tmp]=0;
            tmp=fail[tmp];
        }
    }
    return res;
} 

int main(){
    scanf("%d",&cas);
    while(cas--){
        Init();
        scanf("%d",&n);
        for(int i=1;i<=n;++i) Insert();
        getfail();
        printf("%d\n",calc());
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/void-f/p/8942090.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值