b[N];910intnx[N],ex[N];1112signed main(){13scanf("%s %s", a+1, b+1);14intla=strlen(a+1),lb=strlen(b+1);15nx[1]=lb;16intans=lb+1;17for(inti=2,q=0;i<=lb;i++){//z数组18if(i<=q+nx[q]-1){19intp=i-q+1;20if(p+nx[p]-1<nx[q]) ...
// Problem: P5410 【模板】扩展 KMP(Z 函数)// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P5410// Memory Limit: 500 MB// Time Limit: 1000 ms/// Powered by CP Editor (https://cpeditor.org)// %%%Skyqwq#include<bits/stdc++.h>// #define int long long#definehelp {...
int z[N],p[N]; char a[N],b[N]; void Z(char *s,int len) { for(int i=1;i<=len;++i) z[i]=0; z[1]=len; for(int i=2,l=0,r=0;i<=len;++i) { if(i<=r) z[i]=min(z[i-l+1],r-i+1); for(;i+z[i]<=len&&s[i+z[i]]==s[z[i]+1];++z[i]); if...
#define db double #define INF 10000000000000000ll #define inf 1000000000 #define ldb long double #define pb push_back #define put_(x) printf("%d ",x); #define get(x) x=read() #define gt(x) scanf("%d",&x) #define gi(x) scanf("%lf",&x) #define put(x) printf("%d\n",x) ...
需要提前预处理出 P 的z 函数。代码:void exkmp(char *T, char *P) { int n = strlen(T) - 1, m = strlen(P) - 1; // 同上,注意这里 n 和 m 就是分别实际的文本串和模式串的长度 for (int i = 1, k = 0; i <= n; ++i) { // 注意哪些地方换成了 p(也就是刚刚我说的 e),...
洛谷P5410 【模板】扩展 KMP(Z 函数) 给定两个字符串a,ba,b,要求出两个数组:bb的zz函数数组zz、bb与aa的每一个后缀的LCP长度数组pp。 数据范围:1≤|a|,|b|≤2×1071≤|a|,|b|≤2×107。 蒟蒻语 别的题解为什么代码那么长、讲解那么复杂?蒟蒻不解,写篇易懂一点的,希望没有错误理解。
int z[N],p[N]; char a[N],b[N]; void Z(char *s,int len) { for(int i=1;i<=len;++i) z[i]=0; z[1]=len; for(int i=2,l=0,r=0;i<=len;++i) { if(i<=r) z[i]=min(z[i-l+1],r-i+1);
z[i]表示以第i位为开头的后缀与前缀相等的最大长度。 例如字符串ababaa,可求出它的z函数为603011。 这个函数的求法有点类似于manachermanacher。 首先,特别规定z[1]=字符串长度。 接下来从第二位枚举。设i为当前枚举到的字符串位数。 设ll表示当前区间右端点最靠右的后缀的首位(左端点),即i+z[i]最大的...
LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 反正这个知识点填过了.. code //#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<ctime>#include<cctype...