KMP及AC自动机

KMP及AC自动机练习题

前导知识

AC自动机板块代码未给出

KMP算法AC自动机

1. 【模板】KMP字符串匹配

传送门

#include <iostream>
#include <cstring>
#define MAX_N 1000010
using namespace std;
int len1,len2;
char s1[MAX_N],s2[MAX_N];
int pi[MAX_N];
void prefix_function(){
    int t1=0,t2;
    pi[0]=t2=-1;
    while(t1<len2){
        if(t2==-1||s2[t1]==s2[t2])
            pi[++t1]=++t2;
        else
            t2=pi[t2];
    }
}
void KMP(){
    int t1=0,t2=0;
    while(t1<len1){
        if(t2==-1||s1[t1]==s2[t2]){
            t1++,t2++;
        }
        else t2=pi[t2];
        if(t2==len2){
            printf("%d\n",t1-len2+1);
            t2=pi[t2];
        }
    }
}
int main(){
    scanf("%s",s1);
    scanf("%s",s2);
    len1=strlen(s1);
    len2=strlen(s2);
    prefix_function();
    KMP();
    for(int i=1;i<=len2;i++){
        cout<<pi[i]<<" ";
    }
    return 0;
}

2. [POI2006]OKR-Periods of Words

传送门

#include <cstdio>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const int MAX_N = 1000010;
char s[MAX_N];
int fail[MAX_N],n;
int main(){
    scanf("%d",&n);
    scanf("%s",s);
    int i,j;
    ll cnt=0;
    fail[0]=fail[1]=0;j=0;
    for(i=1;i<n;i++){
        while(j && s[i]!=s[j]) j=fail[j];
        j+=(s[i]==s[j]);
        fail[i+1]=j;
    }
    for(i=1;i<=n;i++){
        j=i;
        while(fail[j]) j=fail[j];
        if(fail[i]!=0) fail[i]=j;
        cnt+=i-j;
    }
    printf("%lld\n",cnt);
    return 0;
}

3. 【模板】AC自动机(简单版)

传送门

4. 【模板】AC自动机(加强版)

传送门

5. 【模板】AC自动机(二次加强版)

传送门

6. [SCOI2016]围棋

传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeGLMath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值