目录写在前面简介算法流程代码复杂度证明求串 \(t\) 所有后缀与串 \(s\) 的最长公共前缀。下位替代与 KMP 的关系例题匹配子串求字符串周期P5410 【模板】扩展 KMP/exKMP(Z 函数)P7114 [NOIP2020] 字符串匹配CF1968G2P9576 「TAOI-2」Cial
##__VA_ARGS__)#else#definedebug(...)void(0)#endiftypedeflonglongLL;intn,m,z[1<<26];chara[1<<26];voidexkmp(intlen){z[1]=len;debug("a = %s\n",a+1);for(inti=2,l=0,r=0;i<=len;i++){if(i<=r)z[i]=min(
voidexKMP(char*s){intn=(int)strlen(s+1);z[1]=0;for(inti=2,l=0,r=0;i<=n;i++){if(i<=r&&z[i-l+1]<r-i+1)z[i]=z[i-l+1];else{z[i]=std::max(0,r-i+1);while(i+z[i]<=n&&s[z[i]+1]==s[i+z[i]])z[i]++;}if(i+z[i]-1>r){l=i;r=i+z[i]-1;...
至于它的求法,个人感觉明明叫\(ExKMP\)却和\(KMP\)毫无关系,反而与\(Manacher\)有着异曲同工之妙。 考虑从小到大枚举\(i\),同时维护\(Mx\)表示已经求解过的位置中最大的\(i+Z(i)-1\),并记录\(id\)表示一个能取到最大值的位置。(注意,\(id\)不能等于\(1\),因为\(Z(1)\)很特殊,为\(n...
void exkmp(char *s,int n,char *t,int m) { Z(t,m); for(int i=1;i<=n;++i) p[i]=0; for(int i=1,l=0,r=0;i<=n;++i) { if(i<=r) p[i]=min(z[i-l+1],r-i+1); for(;i+p[i]<=n&&s[i+p[i]]==t[p[i]+1];++p[i]); ...
Manacher与exKMP(扩展KMP,Z函数) Manacher 算法该算法由 Glenn K. Manacher 在 1975 年提出,首先注意到回文串的对称中心特性可能有所不同(中心可能为一个字符或者是在两个字符之间),那么我们将字母之间插入隔板,这两个回文串的对称中心就都在一个字符上了,such as "|A|B|B|A|"、"|A|B|C|B|A|"对于一...
摘要:这篇总结所有的字符串都是以 0 为下标起点 Z函数(ExKMP) 对于一个字符串 SS 我们规定一个函数 Z[i]Z[i] 表示SS 与S[i...n−1]S[i...n−1] 的LCP(最长公共前缀)的长度。 即 S[0...Z[i]−1]S[0...Z[i]−1] 与\(S[i...i+Z[i]-1] 1921 0 4 编辑 阅读 Copyright...
void exkmp() { getZ(); int now = 0, p0 = 0; while( now<pl && now<sl && p[now]==s[now] ) now++; exlcp[0] = now; for(int i=1;i<sl;i++) { //设x=z[i-p0],有p[0..x-1]==p[i-p0..i-p0+x-1] //s[p0,p0+exlcp[p0]-1]==p[0,exlcp[p0]-1] ...
void exkmp() { getZ(); int now = 0, p0 = 0; while( now<pl && now<sl && p[now]==s[now] ) now++; exlcp[0] = now; for(int i=1;i<sl;i++) { //设x=z[i-p0],有p[0..x-1]==p[i-p0..i-p0+x-1] //s[p0,p0+exlcp[p0]-1]==p[0,exlcp[p0]-1] ...
题目:P5410 【模板】扩展 KMP/exKMP(Z 函数) - 洛谷#include <iostream> using namespace std; const int N=20114514; string a,b; int n,m; int z[N*2]; void calc_Z(string& s,int len) { z[0]=len; for(int i=1,l=0,r=0;i<len;i++) { z[i]=0; if(i<=r&&z[i-l]<r-i...