字符串板子

kmp

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+4;
char a[maxn],b[maxn];
int p[maxn];
int main(){
    scanf("%s",a+1);
    scanf("%s",b+1);
    int n=strlen(a+1),m=strlen(b+1);
    int j=0;
    for(int i=2;i<=m;i++) {
        while(j&&b[j+1]!=b[i]) j=p[j];
        if(b[j+1]==b[i]) j++;
        p[i]=j;
    }
    j=0;
    for(int i=1;i<=n;i++){
        while(j&&b[j+1]!=a[i]) j=p[j];
        if(b[j+1]==a[i]) j++;
        if(j==m){
            printf("%d\n",i-m+1);
        }
    }
    for(int i=1;i<=m;i++) printf("%d\n",p[i]);
}
kmp

AC自动机

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+4;
int tot=0;
struct node{
    int fail,next[26],tag;
}z[maxn];
inline void insert(char *s){
    int len=strlen(s);
    int now=0;
    for(int i=0;i<len;i++){
        int v=s[i]-'a';
        if(!z[now].next[v]) z[now].next[v]=++tot;
        now=z[now].next[v];
    }
    z[now].tag++;
}
inline void build_AC(){
    queue<int>q;
    for(int i=0;i<26;i++) {
        z[z[0].next[i]].fail=0;
        if(z[0].next[i]) q.push(z[0].next[i]);
    }
    while(!q.empty()){
        int now=q.front();q.pop();
        for(int i=0;i<26;i++){
            if(z[now].next[i]){
                z[z[now].next[i]].fail=z[z[now].fail].next[i];
                q.push(z[now].next[i]);
            }else{
                z[now].next[i]=z[z[now].fail].next[i];
            }
        }
    }
}
inline int query(char *s){
    int len=strlen(s);
    int now=0,ans=0;
    for(int i=0;i<len;i++){
        now=z[now].next[s[i]-'a'];
        ans+=z[now].tag;
        z[now].tag=0;
    }
    return ans;
}

猜你喜欢

转载自www.cnblogs.com/wifimonster/p/10232827.html
今日推荐