洛谷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);
}

猜你喜欢

转载自blog.csdn.net/xumingyang0/article/details/85127939
今日推荐