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]); }
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; }