Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?
, the longest symmetric sub-string is s PAT&TAP s
, hence you must output 11
.
Input Specification:
Each input file contains one test case which gives a non-empty string of length no more than 1000.
Output Specification:
For each test case, simply print the maximum length in a line.
Sample Input:
Is PAT&TAP symmetric?
Sample Output:
11
#include<iostream>
#include<cmath>
#include<string.h>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<string>
using namespace std;
typedef long long ll;
/*1暴力
int main(){
string s;
int maxlen = 0;
getline(cin,s);
for(int i = 0; i < s.size(); i++)
{
for(int j = i+1;j<=s.size();j++)
{
string s1 = s.substr(i,j),s2 = s1;
reverse(s2.begin(),s2.end());
if(s2==s1&&maxlen<s1.size())
maxlen=s1.size();
}
}
printf("%d",maxlen);
}*/
//2.manacher算法
const int maxn = 100005;
int n,ans,length[maxn<<1];
string a;char s[maxn<<1];
void init(){
s[0] = '$';
for(int i = 1; i <= n+1;i++)
{
s[2*i-1] = '#';
s[2*i] = a[i-1];
}
n = n*2+2;
}
void manacher(){
int mx = 0 , mid = 0;
mx为目前最长回文子串的右端点 mid为mx对应回文子串的中点
for(int i = 1; i < n ; i++)
{
if(i < mx)
length[i] = min(mx-i,length[2*mid-i]);
else
length[i] = 1;
while(s[i-length[i]]==s[i+length[i]])
{
length[i]++;
if(length[i]+i>mx)
{
mx = length[i]+i;
mid = i;
}
}
}
}
int main(){
getline(cin,a);
//scanf("%s",a);
n = a.length();
init();
manacher();
for(int i = 0; i < n ; i++)
{
ans = max(ans,length[i]);
}
printf("%d",ans-1);
return 0;
}