首页 > 其他分享 >P4555 [国家集训队] 最长双回文串

P4555 [国家集训队] 最长双回文串

时间:2024-07-22 13:52:38浏览次数:11  
标签:temr 端点 int P4555 str teml 国家集训队 回文

原题链接

题解

先求出以所有最长回文子串,然后记录以每个点作为回文串的右端点时的最小左端点和作为回文串的左端点时的最大右端点

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int r[200005],l[200005],p[200005];

void solve()
{
    string s;
    cin>>s;
    int n=s.size();

    string str=" ";
    for(int i=0;s[i];i++)
    {
        str+=s[i];
        str+=' ';
    }

    int center=0;
    int rmax=1;

    p[0]=1;
    for(int i=0;i<n;i++)  r[i]=l[i]=i;
    for(int i=1;str[i];i++)
    {
        if(i<rmax) p[i]=min(p[2*center-i],rmax-i);

        while(i-p[i]>=0 && str[i+p[i]]==str[i-p[i]]) p[i]++;

        if(i+p[i]>rmax)
        {
            rmax=i+p[i];
            center=i;
        }

        if(str[i]==' ')
        {
            if(p[i]>1)
            {
                int teml=i/2-p[i]/2,temr=i/2+p[i]/2-1;
                l[temr]=min(l[temr],teml);
                r[teml]=max(r[teml],temr);
            }
        }
        else
        {
            int teml=i/2-p[i]/2+1,temr=i/2+p[i]/2-1;
            r[teml]=max(r[teml],temr);
            l[temr]=min(l[temr],teml);
        }
    }

    int l1=n-1,r1=n-1;
    for(int i=n-1;i>=0;i--)
    {
        if(l[i]+i<l1+r1)
        {
            l1=l[i];
            r1=i;
        }

        l[i]=r1-i+l1;
    }
    int l2=0,r2=0;
    for(int i=0;i<n;i++)
    {
        if(r[i]+i>r2+l2)
        {
            r2=r[i];
            l2=i;
        }
        r[i]=r2-i+l2;
    }

    int ans=0;
    for(int i=0;i<n-1;i++)
    {
        ans=max(ans,r[i+1]-l[i]+1);
    }
    cout<<ans;
}
int main()
{
    int t=1;
    while(t--) solve();
    return 0;
}


标签:temr,端点,int,P4555,str,teml,国家集训队,回文
From: https://www.cnblogs.com/pure4knowledge/p/18315853

相关文章

  • P1407 [国家集训队] 稳定婚姻
    原题链接题解二分图,分为两类,一类是指向,一类是被指向在这里,只需要建立情人之间的边就行,因为找情人能否成功code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;vector<int>G[10000];intmatch[10000]={0};boolvis[10000]={0};booldfs(intnow)//......
  • 字符串回文
    \(Manacher\)(马拉车)作用:可以在线性复杂度下求出每个点的最长回文半径算法流程:step1.\(manacher\)只能解决有对称中心的回文串,因此需要将所有回文串转化为有对称中心的,具体操作就是在每两个字符之间插入一个无关字符,并在首尾都插入无关字符step2.从左到右依次处理,记......
  • 代码随想录算法训练营第26天 | 回溯02:39. 组合总和、40.组合总和II、131.分割回文串
    代码随想录算法训练营第26天|回溯02:39.组合总和、40.组合总和II、131.分割回文串组合总和https://leetcode.cn/problems/combination-sum/代码随想录https://programmercarl.com/0039.组合总和.html40.组合总和IIhttps://leetcode.cn/problems/combination-sum-ii/desc......
  • 力扣刷题练习九 【234.回文链表】
    前言链表练习题【234.回文链表】。回顾链表知识,做题练习。一、【234.回文链表】题目阅读给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false......
  • C# 返回文件夹及子目录
    ///<summary>///返回文件夹及子目录的文件夹///</summary>///<paramname="directory"></param>///<paramname="files"></param>publicstaticvoidGetFiles(stringdirectory,refDi......
  • Day66 代码随想录打卡|回溯算法篇---分割回文串
    题目(leecodeT131):给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。方法:本题是一个分割回文串的问题,是回溯算法的另一类问题。针对一个字符串,我们要对其进行分割,并且确保分割后生成的子串也必须全都是回文串。分析回溯三......
  • 代码随想录day 23 组合总和 | 组合总和II | 分割回文串
    组合总和组合总和解题思路利用回溯算法进行遍历,由于数组内的数字可以重复调用,因此在套用模板进行遍历时,下一次递归的startIndex是当前遍历的下标。剪枝操作则是通过比较和是否大于目标值,如果大于则不进行下一次的递归,以此来减少循环遍历的次数,这个条件需要加到for循环中。知......
  • LeetCode 125. 验证回文串
    更多题解尽在https://sugar.matrixlab.dev/algorithm每日更新。组队打卡,更多解法等你一起来参与哦!LeetCode125.验证回文串,难度简单。双指针解题思路:遍历字符串,将所有大写字符转换为小写字符、并移除所有非字母数字字符;使用左右指针比较字符,出现不同则直接返回fa......
  • C++算法实践07-回文数
    一、题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例1:输入:x=121输出:true示例 2:输入:x=-121输出:false解释:从左向右读,为-121。从右......
  • SpringBoot返回文件让前端下载的几种方式
    0x01背景在后端开发中,通常会有文件下载的需求,常用的解决方案有两种:不通过后端应用,直接使用nginx直接转发文件地址下载(适用于一些公开的文件,因为这里不需要授权)通过后端进行下载,同时进行一些业务处理本篇主要以方法2进行介绍,方法2的原理步骤如下:读取文件,得到文件的字节流......