1. 程式人生 > >洛谷P3805 【模板】manacher演算法

洛谷P3805 【模板】manacher演算法

題目
題解

#include<bits/stdc++.h>
using namespace std;
const int N=11000002;
int i,j,ans,k,rad[N<<1],len;
char s[N<<1],s1[N];
int main(){
	scanf("%s",s1+1),len=strlen(s1+1);
	for (i=1;i<=len;i++) s[i*2-1]=s1[i],s[i*2-2]='#';
	len=len*2+1;
	s[len-1]='#';
	for (i=0,j=0;i<len;i+=k){
while (i-j-1>=0 && s[i-j-1]==s[i+j+1]) j++; rad[i]=j,ans=max(ans,j); for (k=1;k<=j && rad[i]-k!=rad[i-k];k++) rad[i+k]=min(rad[i]-k,rad[i-k]); j=max(j-k,0); } printf("%d",ans); }