#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <utility>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int MAX=1000000+10;
char s[MAX*2];
int dp[MAX*2];
int maxlen,k,cas=0; //k用来记录已计算过的最长回文串中心位置
int main()
{
while(scanf("%s",s)!=EOF)
{
if(!strcmp(s,"END")) break;
cas++;
int len=strlen(s);
maxlen=0,k=0;
for(int i=len;i>=0;i--) //添加"#"
{
s[i+i+2]=s[i];
s[i+i+1]='#';
}
//printf("%s\n",s);
for(int i=2;i<2*len+1;i++)
{
if(dp[k]+k>i)
dp[i]=min(dp[2*k-i],dp[k]+k-i);
else
dp[i]=1;
while(s[i-dp[i]]==s[i+dp[i]])
dp[i]++;
if(dp[k]+k<dp[i]+i)
k=i;
if(maxlen<dp[i])
maxlen=dp[i];
}
printf("Case %d: %d\n",cas,maxlen-1);
}
return 0;
}
最长回文
最新推荐文章于 2024-02-22 10:36:27 发布