题目链接:题目详情 - L2-008 最长对称子串 (pintia.cn)
样例输入:
Is PAT&TAP symmetric?
样例输出:
11
分析:首先需要注意的就是字符串中含有空格,所以我们可以用getline对字符串进行读入,需要注意的是读入的类型必须是string类型,假如要读入s,用getline(cin,s)即可。
剩下的就是求取一个最大回文子串问题,这个就是一个manacher算法板子题,不懂的小伙伴可以看下这里:Manacher(求解最长回文子串)_AC__dream的博客-CSDN博客
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e4+10;
string a;
char s[N];
int p[N];
int main()
{
getline(cin,a);
a=" "+a;
int len=a.size();
s[0]='#';
for(int i=1;i<=len;i++)
{
s[i<<1]='#';
s[(i<<1)-1]=a[i];
}
len<<=1;
int id=0,mx=1;
p[0]=p[len]=1;
int ans=0;
for(int i=1;i<len;i++)
{
if(i<mx) p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(i-p[i]>=0&&i+p[i]<=len&&s[i-p[i]]==s[i+p[i]]) p[i]++;
if(i+p[i]>mx)
{
mx=i+p[i];
id=i;
}
ans=max(ans,p[i]-1);
}
printf("%d",ans);
return 0;
}