poj 3974

找一个字符串的最长回文字。
manacher模板题
manacher就是往原字符串里面加别的字符,使得得到所有的回文串是奇数的,然后求mp数组,
mp[i]表示以i为中点的最长回文长度

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1000000 + 10;

char a[maxn], ma[maxn*2];
int mp[maxn*2],ans,cas;

void manacher(char a[],int len){
	int l = 0;
	ma[l++] = '$';
	ma[l++] = '#';
	for(int i = 0;i<len;i++){ 
		ma[l++] = a[i];
		ma[l++] = '#'; 
	}
	ma[l] = 0;
	int mx = 0,id = 0;
	for(int i = 0;i<l;i++){
		mp[i] = mx>i ?min(mp[2*id-i],mx-i):1;
		while(ma[i+mp[i]] == ma[i-mp[i]]) mp[i]++;
		if(i+mp[i]>mx){
			mx = i+mp[i];
			id = i;
		}
	} 
}

int main(){
	while(scanf("%s",a)&&strcmp(a,"END")){
		int len = strlen(a);
		memset(mp,0,sizeof(mp));
		ans = 0;
		manacher(a,len);
		for(int i = 0;i<2*len+2;i++)
			ans = max(ans,mp[i]-1);
		printf("Case %d: %d\n",++cas,ans);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/winhcc/article/details/89646575
今日推荐