{模板}AC Automaton

本文详细介绍了使用AC自动机解决HDU2222问题的具体实现过程,包括AC自动机的节点结构定义、插入字符串、建立失败指针以及查询操作等关键步骤,并提供了一个完整的C++代码示例。

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

hdu2222

code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N=1e6+10,M=1e6+10;
queue<int> d;
char s[N];
int n;
struct ac{
    int a[M*10][26],fail[M*50],sum[M*50],tot;
    int makenew() {
        memset(a[tot],-1,sizeof(a[tot]));
        fail[tot]=sum[tot]=0;
        return tot++;
    }
    void insert(char s[]){
        int x=0,i,j,k,len=strlen(s);
        for (i=0;i<len;i++) {
            if (a[x][s[i]-'a']==-1) a[x][s[i]-'a']=makenew();
            x=a[x][s[i]-'a'];
        }
        sum[x]++;
    }
    void build() {
        int i,j,k;
        for (i=0;i<26;i++) {
            if (a[0][i]==-1) a[0][i]=0; 
            else fail[a[0][i]]=0,d.push(a[0][i]);
        }
        while (!d.empty()) {
            int x=d.front();
            for (i=0;i<26;i++) {
                if (a[x][i]==-1) a[x][i]=a[fail[x]][i];
                else fail[a[x][i]]=a[fail[x]][i],d.push(a[x][i]);
            }
            d.pop();
        }
    }
    int query(char s[]){
        int x=0,len=strlen(s),tot=0;
        for (int i=0;i<len;i++) {
            x=a[x][s[i]-'a'];
            int y=x;
            while (y!=0) {
                tot+=sum[y];
                sum[y]=0;
                y=fail[y];
            }
        }
        return tot;
    }
    void init() {
        tot=0;
        makenew();
    }
}aca;
void work() {
    int i,j,k;
    scanf("%d",&n);
    scanf("\n");
    aca.init();
    for (i=1;i<=n;i++) {
        scanf("%s",s);
        aca.insert(s);
    }
    aca.build();
    scanf("%s",s);
    printf("%d\n",aca.query(s));
}
int main() {
    int t;scanf("%d",&t);
    while (t--) work();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值