zoukankan      html  css  js  c++  java
  • 小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;
    
    } 
    
    
    


  • 相关阅读:
    WEB 应用缓存解析以及使用 Redis 实现分布式缓存
    MVC 架构模式
    用两个栈实现队列
    重建二叉树
    从尾到头打印链表
    替换空格
    二维数组中的查找
    二叉树与线索二叉树
    OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践
    开放下载!解锁 Serverless 从入门到实战大“橙”就
  • 原文地址:https://www.cnblogs.com/lipu123/p/14326394.html
Copyright © 2011-2022 走看看