小A的回文串(模拟或者manacher)

链接:https://ac.nowcoder.com/acm/contest/549/B
来源:牛客网

题目描述

小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的。所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意。现在小A可以对这个字符串做一些改动,他可以把这个字符串最前面的某一段连续的字符(不改变顺序)移动到原先字符串的末尾。那么请问小A通过这样的操作之后(也可以选择不移动)能够得到最大回文子串的长度是多少。

输入描述:

一行一个字符串表示给定的字符串S一行一个字符串表示给定的字符串SS

输出描述:

一行输出一个整数,表示通过这样的操作后可以得到最大回文子串的长度。
示例1

输入

复制
dcbaabc

输出

复制
7

说明

将前面的dcba移动到末尾变成abcdcba,这个字符串的最大回文子串就是它本身,长度为7

备注:

N表示字符串的长度,1≤N≤5000
众所周知,如果一个字串是回文串的话分为两种,和aba和aabb,这两种可以都弄成一种,就是加#操作,
比如aba变成#a#b#a#b#,aabb变成#a#a#b#b#这样只需要枚举中间中间点就行
然后看看这个题就是两相同的字符串连再一起之后然后枚举这个中间点就行
#include<iostream>
#include<algorithm>
#include<cstring> 
using namespace std;
const int maxn=1e6+100;
char a[maxn];
string s;
int main(){
    cin>>s;
    s=s+s;
    a[0]='#';
    int cnt=0;
    for(int i=0;i<s.size();i++){
        a[++cnt]=s[i];
        a[++cnt]='#';
    }
    int ans=0;
    for(int i=1;i<=cnt;i++){
        int l=i-1;
        int r=i+1;
        int z=0;
        while(a[l]==a[r]&&z+2<=cnt/2){
            z+=2;
            l--;
            r++;
        }
        ans=max(ans,z);
    }
    cout<<ans/2<<endl;

} 

 



posted @ 2021-01-25 17:33  lipu123  阅读(68)  评论(0编辑  收藏  举报