Time Limit: 15000MS | Memory Limit: 65536K | |
Total Submissions: 6725 | Accepted: 2483 |
Description
Input
Output
Sample Input
abcbabcbabcba abacacbaaaab END
Sample Output
Case 1: 13
Case 2: 6
manacher算法,求最长回文串,算法还是不怎么会,,于是照着模板写了一下,,过了,回去再仔细研读下。
#include
#include
#include
using namespace std;
const int maxn=1000010;
char str[maxn];
char tmp[maxn<<1];
int len[maxn<<1];
int init(char *st)
{
int i,len=strlen(st);
tmp[0]='@';
for(i=1; i<=2*len; i+=2)
{
tmp[i]='#';
tmp[i+1]=st[i/2];
}
tmp[2*len+1]='#';
tmp[2*len+2]='$';
tmp[2*len+3]=0;
return 2*len+1;
}
int manacher(char *st,int l)
{
int mx=0,ans=0,po=0;
for(int i=1; i<=l; i++)
{
if(mx>i)
len[i]=min(mx-i,len[2*po-i]);
else
len[i]=1;
while(st[i-len[i]]==st[i+len[i]])
len[i]++;
if(len[i]+i>mx)
{
mx=len[i]+i;
po=i;
}
ans=max(ans,len[i]);
}
return ans-1;
}
int main()
{
int con=1;
while(scanf("%s",str)&&strcmp(str,"END")!=0)
{
int l=init(str);
printf("Case %d: %d\n",con++,manacher(tmp,l));
}
return 0;
}