【模板】Manacher
https://blog.csdn.net/qq_43456058/article/details/94588721
这玩意和扩展KMP很像,都是利用了
d
p
dp
dp和贪心的思想(选择最远覆盖距离)。同时利用了状态的相似性。然后类似于“镜面”的对称点转换,做到了
O
(
n
)
O(n)
O(n)的复杂度。
#include<bits/stdc++.h>
using namespace std;
const int N=1.1*1e7+5;
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
int len,Len[N*2];
char s[N],str[N*2];
void getstr() {
int k=0;
str[k++]='@';
for(int i=0;i<len;i++) {
str[k++]='#';
str[k++]=s[i];
}
str[k++]='#';
len=k;
}
int manacher() {
int R=0,C;
int maxx=0;
for(int i=1;i<len;i++) {
int i_mirror=2*C-i;
if(R>i) Len[i]=min(R-i,Len[i_mirror]);
else C=i,Len[i]=0;
while(str[i+Len[i]+1]==str[i-Len[i]-1]) Len[i]++;
if(i+Len[i]>R) {
C=i;
R=i+Len[i];
maxx=max(maxx,Len[i]);
}
}
return maxx;
}
signed main() {
scanf("%s",s);
len=strlen(s);
getstr();
printf("%d",manacher());
}

浙公网安备 33010602011771号