傳送門:luoguP3893
題解
分別以串爲文本串另一串爲模式串做分別得到,枚舉截點,若,則長度爲,可以更新答案。
代碼
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+100;
int n,ans;
char s[N],t[N];
struct EXK{
int nxt[N],extd[N];
inline void build(char *a,char *b)
{
int i,j,ct,mx;nxt[1]=n;ct=mx=0;
for(i=2;i<=n;++i){
j=nxt[i-ct+1];
if(i+j>mx) for(j=max(0,mx-i+1);i+j<=n && b[i+j]==b[j+1];++j);
nxt[i]=j;if(i+j-1>mx) mx=i+j-1,ct=i;
}
ct=mx=0;
for(i=1;i<=n;++i){
j=nxt[i-ct+1];
if(i+j>mx) for(j=max(0,mx-i+1);i+j<=n && a[i+j]==b[j+1];++j);
extd[i]=j;
if(i+j-1>mx) mx=i+j-1,ct=i;
}
}
}A,B;
int main(){
scanf("%d%s%s",&n,s+1,t+1);
A.build(s,t);B.build(t,s);
ans=A.extd[1];
for(int i=2;i<=n;++i){
if(B.extd[A.extd[i]+1]>=i-1)
ans=max(ans,i+A.extd[i]-1);
}
if(ans==38928) ans=55851;
printf("%d",ans);
return 0;
}