最长回文 分类: 串 2015-08-03 10:20 5人阅读 评论(0) 收藏
最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11085 Accepted Submission(s): 3946
Problem Description
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa
abab
Sample Output
4
3
今天学习了一个关于O(n)的时间发杂度求最大回文串的;
思路很简单
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define CRR fclose(stdin)
#define CWW fclose(stdout)
#define WW freopen("output.txt","w",stdout)
#define RR freopen("input.txt","r",stdin)
using namespace std;
const int MAX=220010;
char s[MAX];
char str[MAX];
int p[MAX];
int len;
void Change()
{
len=1;
str[0]='$';
for(int i=0;s[i]!='\0';i++)
{
str[len++]='#';
str[len++]=s[i];
}
str[len++]='#';
str[len]='\0';
}
void Get_P()
{
int id=0;
Change();
memset(p,0,sizeof(p));
for(int i=1;i<len;i++)
{
p[i]=id+p[id]>i?min(p[id]+id-i,p[2*id-i]):1;
while(str[i+p[i]]==str[i-p[i]])
p[i]++;
if(p[i]+i>p[id]+id)
{
id=i;
}
}
}
int main()
{
while(~scanf("%s",s))
{
Get_P();
int ans=1;
for(int i=1;i<len;i++)
{
ans=max(ans,p[i]);
}
printf("%d\n",ans-1);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。