这道题是要重写的~
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1e6+5;
string s;
char new_s[2*maxn];
int p[2*maxn];
//插入符号
int init()
{
int len = s.size();
new_s[0] = '$';
new_s[1] = '#';
int p = 1;
for(int i = 0;i<len;i++)
{
new_s[++p] = s[i];
new_s[++p] = '#';
}
return p;
}
int manacher(int len)
{
int mx = 0;
int id = 0;
int max_len = 0;
for(int i = 1;i<=len;i++)
{
if(i<mx)
{
p[i] = min(mx-i,p[2*id-i]);
}
else
{
p[i] = 1;
}
while(new_s[i-p[i]] == new_s[i+p[i]])
{
p[i]++;
}
//希望mx走得更远
if(i+p[i]>mx)
{
mx = i+p[i];
id = i;
}
if(max_len<p[id]-1)
{
max_len = max(max_len,p[id]-1);
}
}
return max_len;
}
int main()
{
int id = 0;
int len;
int kase = 0;
while(cin>>s && s!="END")
{
printf("Case %d: %d\n",++kase,manacher(init()));
}
return 0;
}