KMP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void pre() { fail[1]=0; for(int i=2,j=0;i<=m;i++) { while(j && s2[i]!=s2[j+1]) j=fail[j]; if(s2[i]==s2[j+1]) j++; fail[i]=j; } }
void kmp() { for(int i=1,j=0;i<=n;i++) { while(j && s1[i]!=s2[j+1]) j=fail[j]; if(s1[i]==s2[j+1]) j++; if(j==m) printf("%d\n",i-m+1),j=fail[j]; } }
|
Manacher
1 2 3 4 5 6 7 8 9
| void solve(char* a,int n) { for(int i=0,p=0,r=0;i<n;i++) { if(i<r) f[i]=min(f[2*p-i],r-i+1); else f[i]=1; while(0<=i-f[i] && i+f[i]<n && a[i-f[i]]==a[i+f[i]]) f[i]++; if(i+f[i]-1>r) p=i,r=i+f[i]-1; } for(int i=0;i<n;i++) f[i]--; }
|
Z函数
1 2 3 4 5 6 7 8 9 10 11
| vector<int> z_function(char* s) { int len=n+m+1; vector<int> z(len); for(int i=1,l=0,r=0;i<len;i++) { if(i<=r) z[i]=min(r-i+1,z[i-l]); while(i-z[i]<len && s[i+z[i]]==s[z[i]]) z[i]++; if(i+z[i]-1>r) l=i,r=i+z[i]-1; } z[0]=m; return z; }
|
Author:
Push_Y
Permalink:
https://wzsyyh.github.io/post/string/
License:
Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan:
I'll make IT!