POJ 3974 最长回文 Manacher算法

原创 2012年03月22日 21:21:20

容斥刷不动啊!!今天十分的邪恶加猥琐的注册了一个小号和大一的孩子们一起做题;
也没有要和他们比赛的意思,只是我对算法有很多不熟悉的,所以呢....哎 我的号交几个题,小号交几个题。
做都做了,不管了。
晚上花了一个半小时才看懂的一个算法Manacher,专门用来做回文的....
网上其他的人写得佷详细了,我还是说说自己的吧。
Manacher利用了回文的性质。
假设有一个回文以id为中点,p[id]是这个回文的半径。
那么id右边的点i,若点i在id控制的回文串的范围内。
则i关于id对称的点j,通过几何性质可得出j=id*2-i;
则以j为中点的回文串的左边界若处于id回文串的左边界以内。
则由回文的性质可得知p[i]与p[j]是等价的。
因为以j为中心的字符串完全在id的回文串内,若j所决定的回文串超出了id的左边界.
那么以i为中心的字符串最长为mx-i,也就是i离mx的距离为p[i],i的回文长度。
做完这一步再由i向左右拓展,使得回文串增长。
这样达到的最右边mx进行更新。
大体的算法就是这样了:

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;

int p[2222222];
char str[1111111],str1[2222222];
int len;

void Init()
{
 	 str1[0]='$';
 	 str1[1]='#';
 	 len=2;
 	 for( int i=0;str[i]!=0;i++ )
 	 {
	  	  str1[len++]=str[i];
	  	  str1[len++]='#';
	 }
	 str1[len]=0;
}

int main()
{
 	int T=0;
 	while( scanf("%s",&str)!=EOF )
 	{
	 	   if( strlen(str)==3 && str[0]=='E' && str[1]=='N' && str[2]=='D' )
	 	   	   break;
 		   //memset( str1,0,sizeof(str1) );
 		   memset( p,0,sizeof(p) );
	 	   Init();
	 	   int id,mx=0;
	 	   for( int i=1;i<len;i++ )
	 	   {
		   		if( mx>i )
		   			p[i]=min(p[(id<<1)-i],mx-i);
		   		else
		   			p[i]=1;
		   		while( str1[i-p[i]]==str1[i+p[i]] )
				   	   p[i]++;
			    if( mx<i+p[i] );
				{
				 	mx=i+p[i];
				 	id=i;
		 		}
	   	   }
	   	   printf( "Case %d: ",++T );
	   	   int ans=0;
	   	   for( int i=1;i<len;i++ )
	   	   		ans=max(p[i],ans);
	   	   printf( "%d\n",ans-1 );
  	}
 	return 0;
}


版权声明:本文为博主原创文章,转载请写明出处。

相关文章推荐

hdu3068 最长回文 poj3974 Palindrome(Manacher算法)

#include #include #include #include using namespace std; char a[110005],str[220010]; int p[220010]; ...
  • turbo_7
  • turbo_7
  • 2013年05月21日 23:56
  • 404

POJ-3974-Palindrome- Manacher 马拉车算法(On寻找最长回文串)

http://poj.org/problem?id=3974 马拉车算法的讲解,这个地方讲得很详细:http://www.cnblogs.com/grandyang/p/4475985.html ...
  • viphong
  • viphong
  • 2016年01月08日 09:51
  • 456

POJ 3974 Palindrome 最长回文子串(manacher算法)

【题意简述】:如题,找出最长的回文字串! 【思路】:看完题的第一反应时枚举求解!但是数据量很大,字符串的长度可达1000000,若暴力求解,很明显会是O(n^2),所以一定会超时! 这里贴出我的超时代...

最长回文 (hdu3068 && poj3974)Palindrome

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi...

POJ 3974 Palindrome 求最长回文子串 Manacher

纯模板题,用来练手,模板记错贡献一次wa。 Palindrome Time Limit: 15000MS   Memory Limit: 65536K Total Submi...

最长回文串——manacher算法java实现

最长回文串是一个很好玩的话题,给出一个无序的不定长的字符序列,如何知道里面的最长回文串呢? manacher算法的思想是 把偶数、奇数长的字符序列变成奇数长度 创建一个与字符串等长的数组,用来记录字符...

Leetcode|Longest Palindromic Substring(最长回文的几种方法)(Manacher算法)

Given a string S, find the longest palindromic substring in S. You may assume that the maximum l...

hdu 3068 最长回文(manacher算法)

题意:给出一个字符串,求这个字符串的最长回文子串。 关于manacher算法网上有很多讲解,我不再赘述。但是我看大部分讲解都没有解释为什么manacher算法的复杂度是O(n),我尝试着解释一下。 代...

Manacher算法求最长回文

来源:点击打开链接 O(n)回文子串算法     这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法. 原文地址: 点击打开链接     其实原文说得...

HDU 3068 最长回文(Manacher算法)

Time Limit:2000MS Memory Limit:32768KBDescription 给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度. 回...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3974 最长回文 Manacher算法
举报原因:
原因补充:

(最多只允许输入30个字)