hdu 3068(最长回文)

题意:容易理解...

思路:可以用扩展kmp来做,但是我还没怎么弄懂,时间复杂度O(n*logn),而manacher算法,第一次听说,代码比较短,不难理解,和扩展kmp有点类似,时间复杂度为:O(n),所以manacher算法更好吧!学习这个算法我推荐一个好的博客:http://blog.csdn.net/kg_second/article/details/8865210

代码实现:

#include<iostream>
#include<string.h>
using namespace std;
char str1[],str2[*];
int n,a[*];
int min(int x,int y)
{
return x>y?y:x;
}
void bian(int len)
{
int i;
n=;
str2[]='$';
for(i=;i<len;i++)
{
str2[n++]='#';
str2[n++]=str1[i];
}
str2[n]='#';
}
int solve()
{
int max=-;
int i,k,p=;
for(i=;i<n;i++)
{
if(i<p)
a[i]=min(a[k*-i],p-i);
else
a[i]=;
for(;str2[i+a[i]]==str2[i-a[i]];a[i]++)
;
if(i+a[i]>p)
{
k=i;
p=i+a[i];
}
if(max<a[i])
max=a[i];
}
return max;
}
int main()
{
int len,max;
while(scanf("%s",str1)!=EOF)
{
len=strlen(str1);
getchar();
bian(len);
max=solve();
printf("%d\n",max-);
}
return ;
}
上一篇:python 2.7 学习笔记--day1--基础语句和语法


下一篇:android中finish和system.exit方法退出的区别