题目链接:http://poj.org/problem?id=3974
题意:给你一个字符串让你输出最长回文字符串的个数
思路:可以用manacher也可以用kmp,但是kmp不会用(别问我是怎么知道可以用kmp的)
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=2000009;
char s[N],ss[N];
int p[N];
int i,l;
int mancher()
{
memset(p,0,sizeof(p));
s[0]='$';
s[1]='#';
for(i=0; i<l; i++)
{
s[i*2+2]=ss[i];
s[i*2+3]='#';
}
s[2*l+2]='\0';
int max=0;
int id=0;
for(i=1; i<2*l+2; i++)
{
if(i<max)
{
p[i]=min(p[2*id-i],p[id]+id-i);
}
else
{
p[i]=1;
}
while(s[p[i]+i]==s[i-p[i]])
{
p[i]++;
}
if(max<p[i]+i)
{
max=p[i]+i;
id=i;
}
}
int mx=0;
for(i=1; i<2*l+2; i++)
{
if(mx<p[i]-1)
{
mx=p[i]-1;
}
}
return mx;
}
int main()
{
int t=0;
while(scanf("%s",ss)&&strcmp(ss,"END")!=0)
{
t++;
l=strlen(ss);
int ans=mancher();
printf("Case %d: ",t);
printf("%d\n",ans);
}
}