题目
#include<bits/stdc++.h>
#define int long long
#define N 1000004
#define inf 0xffffff
#define p1 151
#define p2 131
#define mod1 100005
#define mod2 1000006
using namespace std;
int front_hash1[N],front_hash2[N],back_hash1[N],back_hash2[N];
int pow1[N],pow2[N];
bool check1 ( int m , int len ){
int f_h1,b_h1;
f_h1 = (front_hash1[m + len] - front_hash1[m - len - 1] * pow1[m + len - m + len + 1] % mod1 + mod1 ) % mod1;
b_h1 = (back_hash1[m - len - 1] - back_hash1[m + len] * pow1[m + len - m + len + 1] % mod1 + mod1 ) % mod1;
if ( f_h1 == b_h1 ){
return true;
}
return false;
}
bool check2( int m , int len ){
int f_h2,b_h2;
f_h2 = (front_hash2[m + len] - front_hash2[m - len - 1] * pow2[m + len - m + len + 1] % mod2 + mod2 ) % mod2;
b_h2 = (back_hash2[m - len - 1] - back_hash2[m + len] * pow2[m + len - m + len + 1] % mod2 + mod2 ) % mod2;
if ( f_h2 == b_h2 ){
return true;
}
return false;
}
signed main(){
string x;
int cnt = 1;
while (1){
int ans = -inf;
cin >> x;
if ( x == "END" ){
return 0;
}
int len = x.size();
for ( int i = 0; i < len; i ++ ){
if ( i == 0 ){
front_hash1[i] = x[i] % mod1;
front_hash2[i] = x[i] % mod2;
}
else{
front_hash1[i] = (front_hash1[i - 1] * p1 + x[i] ) % mod1;
front_hash2[i] = (front_hash2[i - 1] * p2 + x[i] ) % mod2;
}
}
for ( int i = 0; i < len; i ++ ){
back_hash1[i] = (back_hash1[i + 1] * p1 + x[i] ) % mod1;
back_hash2[i] = (back_hash2[i + 1] * p2 + x[i] ) % mod2;
}
for ( int j = 1; j <= len - 1; j ++ ){
int l = 1,r = ( len / 2 + 1 );
while ( l <= r ){
int mid = (l + r) >> 1;
if ( check1(j,mid) || check2(j,mid) ) l = mid + 1;
else r = mid - 1;
}
ans = max ( ans , r );
}
cout << "Case " << cnt << ": " << ans << "\n";
cnt ++;
}
return 0;
}