Saito Asuka saiko!!!

有些走累了呢 有些走累了呢 虽然以那麼平凡的表现 来形容人生的漫长道路 想稍稍休息下呢 想稍稍休息下呢 时间每分每刻都这样残酷 将我紧拖著前行...

板子|manacher算法

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=11000005;
char s[maxn*3],tmp[maxn*3];
int p[maxn*3];
int create(){//插入特殊字符,将新的字符串tmp长度变为奇数。  并返回长度 
	int len=strlen(s);
	tmp[0]='$';//防止越界 
	tmp[1]='#';
	int j=2;
	for(int i=0;i<len;i++){
		tmp[j++]=s[i];
		tmp[j++]='#';
	}
	tmp[j]='\0';//防止越界
	return j;
	
}
int manacher(){
	int len=create(),ans=-1;
	int id,mx=0;/*回文串最右端点*/
	for(int i=1;i<len;i++){
		if(i<mx) p[i]=min(mx-i,p[2*id-i]);
		else p[i]=1;
		while(tmp[i-p[i]]==tmp[i+p[i]]) p[i]++;
		if(mx<i+p[i]){
			id=i;
			mx=i+p[i];
		}
		ans=max(ans,p[i]-1);//字符串长度就是p[i]-1
		                    //证明:tmp中的长度为2*p[i]-1
							//其中特殊字符比原字符长度多1. 
	}
	return ans;
}
int main(){
	scanf("%s",s);
	printf("%d",manacher());
	return 0;
}
posted @ 2018-11-27 16:33  斋藤飞鸟  阅读(221)  评论(0编辑  收藏  举报
动画加载完毕