Codeforces D. Prefix-Suffix Palindrome

2023-05-16

Codeforces D. Prefix-Suffix Palindrome

题解:

和D1相同,区别是找中间的回文串要压缩时间,用到了马拉车算法。(算法介绍在下面:

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

ll maxlen, flg;
string Manacher(string s1){
    string s = "$#";
    for (int i = 0; i < s1.size(); i++){
        s += s1[i], s += '#';
    }
    vector<ll> p(s.size(), 0);
    ll c = 0, ra = 0;
    maxlen = 0; flg = 0;
    for (int i = 1; i < s.size(); i++){
        p[i] = ra > i + p[i] ? min(p[2 * c - i], ra - i) : 1;
        while(s[i+p[i]] == s[i-p[i]]) ++p[i];
        if(ra < i+p[i]){
            c = i; ra = i+p[i];
        }
        if(i == p[i] && maxlen < p[i]){
            maxlen = p[i] - 1; flg = 1;
        }
        if(i+p[i] == s.size() && maxlen < p[i]){
            maxlen = p[i] - 1, flg = 2;
        }
    }
    if(flg == 1)
        return s1.substr(0, maxlen);
    else{
        return s1.substr(s1.size() - maxlen);
    }
}
void solve(){
    string src; cin >> src;
    ll l = 0, r = src.size() - 1;
    while(l<r && src[l] == src[r]){l++, r--;}
    if(l >= r){
        cout << src << endl;
        return;
    }
    //cout << src.substr(l, r - l + 1) << "  ";
    string mid = Manacher(src.substr(l, r-l+1));
    //cout << mid << endl;
    cout << src.substr(0, l) + mid + src.substr(r+1) << endl;
}
int main(){
    ios_base::sync_with_stdio(0);
    ll t;cin >> t;
    while(t--){
        solve();
    }
    return 0;
}

Manacher算法 思想

$ p[i]= r > i + p[i] ? min( p[2 * c - i] , r - i) : 1$
p[i]维护回文串的长度,r是预处理后的字符串中回文串能到达的最右端,c是到达最右端时的中点。

i _ m i r r o r = 2 ∗ c − i i\_mirror = 2 * c - i i_mirror=2ci;
如图,很明显,当r大于当前遍历字符串i点+其回文长度时,此时可以发现 i 点和 i_mirror 点关于c对称,
因为c的回文右端到达r点,这时 p [ i _ m i r r o r ] p[i\_mirror] p[i_mirror] 是已经被计算的 。
假如 r − i > = p [ i _ m i r r o r ] r-i>=p[i\_mirror] ri>=p[i_mirror] 即 i到以c为中点的回文串最右端r比以$i_mirror 为 中 心 的 回 文 串 长 度 大 , 那 么 此 时 为中心的回文串长度大,那么此时 p[i] 的 值 至 少 是 的值至少是 p[i_mirror] ; 当 ; 当 r - i< p[i_mirror]$ 时,此时以 i _ m i r r o r i\_mirror i_mirror为中心的回文串长度比i到 i到以c为中点的回文串最右端r 大,那么关于中心点c 对称的$ p[i_mirror] 部 分 值 无 法 得 到 匹 配 ( 大 于 r 部 分 ) , 此 时 部分值无法得到匹配(大于r部分),此时 rp[i] 的 值 至 少 是 的值至少是 r-i$ 。

模板:

string Manacher(string s1){
    string s = "$#";
    for (int i = 0; i < s1.size(); i++){  s += s1[i], s += '#'; }
    vector<int> p(s.size(), 0);
    int c = 0, r = 0, maxlen = 0, maxpoint = 0;
    for (int i = 1; i < s.size(); i++){
        p[i] = r > i + p[i] ? min(p[2 * c - i], r - i) : 1;  //见上述
        while(s[i+p[i]] == s[i-p[i]]) ++p[i];  //中心拓展算法
        if(r < i+p[i]){ c = i; r = i+p[i]; }
        if(maxlen < p[i]){ maxlen = p[i]; maxpoint = i;  }
    }
    return s1.substr((maxpoint - maxlen) / 2, maxlen - 1);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Codeforces D. Prefix-Suffix Palindrome 的相关文章

  • Educational Codeforces Round 67 (Rated for Div. 2)

    contest链接 A Stickers and Toys time limit per test 2 seconds memory limit per test 256 megabytes input standard input out
  • Codeforces Round #697 (Div. 3) C. Ball in Berland(1400)

    Codeforces 1475 C Ball in Berland 题目分析 这个题其实就是给你一堆坐标 让你找到合适的有多少对 思路分析 坐标的话 首先想到用 pair
  • Codeforces Round 739 (Div. 3)

    A Dislike of Threes AC代码 include
  • 1600*C. Slava and tanks(思维)

    解析 如果n为奇数 则偶数位为奇数位少 1 则先轰炸偶数位 再轰炸奇数位 再一次轰炸偶数位 如果n为偶数 则任意顺序 于是无论奇偶 全部按照 偶 奇 偶 轰炸 则总次数为 n n 2 下取整 include
  • Codeforces Round #561 (Div. 2)ABC

    三个题 各位大佬别喷我 我很菜 A Silent Classroom There are n students in the first grade of Nlogonia high school The principal wishes
  • Codeforces 1454B Unique Bid Auction(模拟)

    Description 题目大意 找到一个序列中唯一且是最小的那个数的下标 感叹我的语言描述真是越来越精炼了 解题思路 算法标签 模拟 记录每个数字出现的次数以及其下标 然后从1开始寻找 第一个找到的数字的下标就是答案 没什么难度 只是不想
  • Puzzles【Codeforces 697 D】【树形DP + 期望DP】

    Codeforces Round 362 Div 2 D 我们从1号结点开始 给每个结点标序 问的是每个结点的序号的期望是多少 输出这N个结点的期望 那么1号点的期望一定就是1了 对于其他的点呢 可以举例这样的一幅图 首先我们可以确定1 因
  • Educational Codeforces Round 149 (Rated for Div. 2)A~D

    Grasshopper on a Line 题意 给出n和k 求从0到n最少走几步 以及步长 要求步长不能整除k 思路 从n往下找到 k不等于0的数 输出该数和n 该数即可 如果n k 0 那就只需要一步 代码 gt File Name a
  • 验证字符串是否是旋转回文的有效方法?

    旋转回文就像 1234321 3432112 最简单的方法是将字符串切成不同的部分 然后将它们连接起来 看看该字符串是否是回文 这将需要 O n 2 因为有 n 次切割 并且对于每次切割 我们需要 O n 来检查字符串是否是回文 我想知道是
  • 如何在R中使用ggplot2制作的图的y轴刻度中准确显示数字的SI前缀?

    我有以下图 使用此代码生成 plt lt ggplot d2 aes string x names same df 1 y value geom point aes color variable size 1 theme bw theme
  • 欧拉问题#4

    使用Python 我试图解决问题 4 of the 欧拉计划问题 有人可以告诉我我做错了什么吗 问题是找到由两个 3 位数乘积组成的最大回文数 这是我到目前为止所拥有的 import math def main for z in range
  • 不同回文子串的数量

    给定一个字符串 我知道如何找到回文子串的数量使用 Manacher 算法在线性时间内完成 但现在我需要找到数量独特 独特回文子串 现在 这可能会导致 O n n 2 算法 一个 n 用于查找所有此类子字符串 而 n 2 用于将这些子字符串中
  • 检查字符串是否为回文

    我有一个字符串作为输入 必须将字符串分成两个子字符串 如果左子串等于右子串 则执行一些逻辑 我怎样才能做到这一点 Sample public bool getStatus string myString 例子 myString ankYkn
  • 在 LESS 中生成供应商前缀

    我已经将这种方法拼凑在一起 使用 LESS 生成供应商前缀的属性和动画 首先是一些工厂函数 vendorprefix property value webkit property value moz property value ms pr
  • 使用 .NET StringDictionary 通过列表/字典进行前缀搜索?

    我想知道 NET 是否提供任何标准功能来通过列表或字典对象进行前缀搜索 我遇到了StringDictionary 但不知道它是否可以为我做到这一点 如果它可以进行前缀搜索 它也可以进行子字符串搜索或让我使用正则表达式之类的东西进行搜索吗 提
  • int b=0,a=1;b=++a+++a; b 的值是多少?它的计算方法是什么? [复制]

    这个问题在这里已经有答案了 int main int b 0 a 1 initialize a and b b a a calculate assign the value of b print f d b return 0 b 的值是多少
  • 从文本文件打印所有回文

    我看了这个问题 BASH 回文检查器 https stackoverflow com questions 26601234 bash palindrome checker 这就是该线程中问题答案所显示的内容 grep E a z 3 45
  • Java中StringBuilder如何逆向工作?

    我正在尝试解决这个leetcode问题https leetcode com problems palindrome linked list https leetcode com problems palindrome linked list
  • 向数据集中选定的一组列名称添加后缀

    我想向数据集 CTDB 中的一组列添加后缀 例如 我有以下列 我想在末尾添加 Child 该子集是包含 100 多列的较大数据集的一部分 我不想重写每个列名称 9 SCARED BREATHE 10 SCARED HEADACHE SCHO
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数

随机推荐

  • Dockerfile简介

    1 什么是dockerfile Dockerfile是一个包含用于组合映像的命令的文本文档 可以使用在命令行中调用任何命令 Docker通过读取Dockerfile中的指令自动生成映像 docker build命令用于从Dockerfile
  • 容器通信之跨链接通信

    前言 同一主机下搭建容器应用栈的环境 xff0c 只需要完成容器互联来实现容器间的通信即可 xff0c 这里采用docker run link选项建立容器间的互联关系 docker官方已不推荐使用docker run link来链接2个容器
  • Linux进程间通信

    1 unix域套接字 域套接字 xff1a 1 只能用于同一设备上不同进程之间的通信 xff1b 2 效率高于网络套接字 域套接字仅仅是复制数据 xff0c 并不走协议栈 xff1b 3 可靠 xff0c 全双工 xff1b 2 IP套接字
  • 什么是API

    1 什么是API API是Application Programming Interface xff08 应用程序接口 xff09 的缩写 是一些预先定义的函数 xff0c 目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力
  • FreeRTOS(二)任务基础知识

    一 前后台系统与RTOS 前后台系统 61 死循环 xff08 通常为1个 xff09 43 中断服务程序 xff08 通常为若干个 xff09 应用程序是一个无限循环 xff0c 循环中调用 API 函数完成所需的操作 xff0c 这个大
  • SBUS协议(20200210)

    最近看到很多sbus协议 xff0c 就专门搜集了一些资料学习一下 1 介绍 SBUS是一个接收机串行总线输出 xff0c 通过这根总线 xff0c 可以获得遥控器上所有通道的数据 目前很多模型及无人机电子设备都支持SBUS总线的接入 使用
  • 【openmv专题】串口通信

    这篇文章主要讲述openmv串口通信过程中会出现错位 xff0c 因缓存空间不足带来的串口报错问题 xff0c 直接进入正题 xff1a 串口通信有同步和异步之分 xff0c 而openmv用的是异步通信 xff0c 需要有缓存区 xff0
  • FreeRTOS任务上下文切换与任务状态切换的区别及联系

    FreeRTOS 中的任务上下文切换和任务状态切换是两个不同的概念 1 任务状态切换是指任务从一种状态切换到另一种状态 FreeRTOS 中的任务状态包括就绪态 阻塞态和运行态 当任务从就绪态切换到运行态时 xff0c 任务开始执行 xff
  • XGBOD:用无监督表示学习改进有监督离群点检测

    XGBOD Improving Supervised Outlier Detection with Unsupervised Representation Learning 论文链接 xff1a https www andrew cmu e
  • 小觅S系列相机运行vins-mono(轨迹飘飞解决版)

    小觅S系列相机运行vins mono xff08 轨迹飘飞解决版 xff09 1 SDK驱动2 获得相机标定数据3 下载MYNT EYE VINS Sample4 运行 前期准备 xff1a 安装并成功运行VINS MONO 1 SDK驱动
  • 嵌入式第0部分:嵌入式工程师完全学习指南

    一 什么是嵌入式 xff08 一 xff09 定义 xff1a 传统定义 xff08 狭义嵌入式 xff09 xff1a 嵌入式系统是以应用为中心 xff0c 以计算机技术为基础 xff0c 并且软硬件课裁剪 xff0c 适用于应用系统对功
  • 【SLAM 十四讲】---第七讲、视觉里程计

    第七讲 视觉里程计
  • Vscode配置git

    1 Git介绍和安装 Git是什么 Git是目前世界上最先进的分布式版本控制系统 xff08 没有之一 xff09 简单来说 它是控制项目版本的一个工具 我们可以利用Git进行多人协作和代码备份等工作 下载git xff08 64bit w
  • Xshell连接虚拟机Ubantu失败解决办法(主机和虚拟机能够互ping的前提)

    主机和虚拟机互ping 在主机命令行里输入ipconfig指令 xff0c 查询主机ip地址 xff0c 在虚拟机Ubantu终端里输入ping 主机ip地址 xff0c ping通后 xff0c 按ctrl 43 c停止 在虚拟机Uban
  • windows 11系统安装

    安装前注意事项 1 准备8G或8G以上U盘 xff08 32G以内 xff09 2 安装系统前备份好个人需要数据 xff08 制作U盘会格式化U盘 xff0c U盘内的重要文件也要事先备份好 xff09 3 预装office的务必记住自己激
  • docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at

    一 前言 docker安装完成 xff0c 一般用户没有权限启动docker服务 xff0c 只能通过sudo来通过root用户权限来启动docker xff0c 此时对于一般用户而言 xff0c 需要执行docker ps或者docker
  • Neo4j(七)——创建新数据库(如何在Neo4j中创建新数据库)

    方法一 xff1a 找到neo4j安装目录 xff0c 编辑conf文件夹中的neo4j conf 找到dbms active database 61 xff0c 将下图中的graph db用其他名称替换 xff0c 并解除注释 xff08
  • python VScode使用gitlab简单使用流程

    一 下载安装软件 1 安装好vscode xff0c 如未安装 xff0c 下载并且安装 https code visualstudio com Download 2 安装git windows客户端 https git scm com d
  • keil5工程函数无法跳转到函数定义解决方法

    问题描述 在使用keil查看工程代码时 xff0c 进行函数的跳转 xff0c 跳转不成功并提示以下错误 这是因为在编译工程的时候少勾选了一个选项 xff0c 按下以下方式勾选上然后重新Rebuild一下工程就好了
  • Codeforces D. Prefix-Suffix Palindrome

    Codeforces D Prefix Suffix Palindrome 题解 xff1a 和D1相同 xff0c 区别是找中间的回文串要压缩时间 xff0c 用到了马拉车算法 xff08 算法介绍在下面 xff1a span class