【CF】团队训练赛2 J-Palindrome Reversion 题解

传送门:Palindrome Reversion
标签:字符串

题目大意

规定一个操作:选择字符串中的一段区间[l,r]并使其翻转。现在给出一个字符串s,你要判断能否通过一次操作使其变为回文串。
输入:一个字符串,其长度不超过1e5。
输出:可以则输出l和r,否则输出"-1 -1"。

算法分析

  • 题目的意思可以说是相当的简单,但正所谓大道至简,容易读懂不代表容易做。我们先要知道回文串的特征:翻转后与翻转前完全相同(这里指的是整个字符串reverse)。那么我们可以大胆地猜测一个结论:原字符串首尾相同的部分必然不被包含在操作区间[l,r]中。因为如果有一部分在[l,r]之间,要想保证操作后整个串回文,就要让替换这部分的字符与之相同,那么替换就毫无意义。
  • 也就是说我们可以先通过遍历找到第一个不满足首尾相同的字符,假设其下标是i,这样一来区间[l,r]要么包括i,要么包括len-i+1(这里len为字符串长度)。因为此时的字符串第一个字符和最后一个字符不同,所以需要换掉第一个或者最后一个字符来使得它们相同,但是又要想到同时替换并不会改变它们的对应关系。
  • 所以现在问题变得简单了起来,只要在去掉了首尾相同部分的新字符串上从前往后枚举区间,再从后往前枚举区间,并判断翻转后整体是否回文,就能得出方案的可行性。不过实现起来有点难度,因为要正反各处理一次哈希,还要用到哈希值的截取、拼接等操作,稍有不慎就会出bug。不过有一个小技巧能让本题轻松一半,就是在正向枚举完区间后将整个字符串翻转,然后再次正向枚举区间,这样就和反向枚举区间的作用是一样的了。
  • 最后还要特判一下原字符串本身就回文的情况,这时直接输出1和len即可。只要推出了最初的结论,这题的思路就很简单,难点主要在于实现。以上算法总体时间复杂度为预处理双向哈希的复杂度,即O(n)。

代码实现

#include <iostream>
using namespace std;
#include <algorithm>
#include <cstring>
long long len,hal[100005],har[100005],base[100005]={1LL};
const int mod=1e9+19;
const long long P=13031LL;
char str[100005],str1[100005];
void init(){int i;hal[0]=str[0];for(i=1;i<len;i++)hal[i]=(hal[i-1]*P+str[i])%mod;har[len-1]=str[len-1];for(i=len-2;i>=0;i--)har[i]=(har[i+1]*P+str[i])%mod;
}
long long getl(int l,int r){if(l>r)return 0;if(!l)return hal[r];return (hal[r]-1LL*hal[l-1]*base[r-l+1]%mod+mod)%mod;
}
long long getr(int l,int r){if(l>r)return 0;if(r==len-1)return har[l];return (har[l]-1LL*har[r+1]*base[r-l+1]%mod+mod)%mod;
}
int main(){int i,j,x,len1;bool flag=0;ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);for(i=1;i<=1e5;i++)base[i]=base[i-1]*P%mod;cin>>str1;len1=strlen(str1);for(j=0;j<len1&&str1[j]==str1[len1-j-1];j++);if(j==len1){cout<<1<<' '<<len1;return 0;}for(i=j;i<len1-j;i++)str[i-j]=str1[i];len=len1-2*j;init();x=len/2;for(i=0;i<len;i++)if(i<x){if(getr(x,len-1)==(getr(0,i)*base[x-1+(len&1)-i]%mod+getl(i+1,x-1+(len&1)))%mod){cout<<1+j<<' '<<i+1+j;return 0;}}else{if(getr(i-x+1,i)==(getl(0,i-x-(len&1))+getr(i+1,len-1)*base[i-x-(len&1)+1]%mod)%mod){cout<<1+j<<' '<<i+1+j;return 0;}}reverse(str,str+len);init();x=len/2;for(i=0;i<len;i++)if(i<x){if(getr(x,len-1)==(getr(0,i)*base[x-1+(len&1)-i]%mod+getl(i+1,x-1+(len&1)))%mod){cout<<len1-(i+1+j)+1<<' '<<len1-(1+j)+1;return 0;}}else{if(getr(i-x+1,i)==(getl(0,i-x-(len&1))+getr(i+1,len-1)*base[i-x-(len&1)+1]%mod)%mod){cout<<len1-(i+1+j)+1<<' '<<len1-(1+j)+1;return 0;}}cout<<-1<<' '<<-1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在苹果电脑MAC上安装Windows10(双系统安装的详细图文步骤教程)

在苹果电脑MAC上安装Windows10&#xff08;双系统安装的详细图文步骤教程&#xff09; 一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启动转换助理步骤2&#xff1a;启动转换助理步骤3&…

波奇学Linux:进程通信管道

进程通信 管道&#xff1a;基于文件级别的单向通信 创建父子进程&#xff0c;使得进程的struct file*fd_array[]的文件描述符指向同一个struct file文件&#xff0c;这个文件是内存级文件。 父进程关写端&#xff0c;子进程再关闭读端。实现单向通信 子进程写入&#xff0c;父进…

Java面向对象(三)

一、封装&#xff1a; 一般意义的封装&#xff1a;把一段重复代码抽取成一个函数&#xff0c;称为代码的封装&#xff08;包装&#xff09;面向对象语言的封装&#xff1a;将类的某些信息隐藏在类的内部&#xff08;通过使用不同的访问权限修饰符&#xff09;&#xff0c;不许…

C++ Primer 笔记(总结,摘要,概括)——第3章 字符串、向量和数组

目录 3.1 命名空间的using声明 3.2 标准库类型string 3.2.1 定义和初始化string对象 3.2.2 string对象上的操作 3.2.3 处理string对象中的字符 3.3 标准库类型vector 3.3.1 定义和初始化vector对象 3.3.2 向vector对象中添加元素 3.3.3 其他vector操作 3.4 迭代器介绍 3.4.…

如何使用rocketmq实现分布式事务?

什么是rocketmq事务消息 事务消息是 Apache RocketMQ 提供的一种高级消息类型&#xff0c;支持在分布式场景下保障消息生产和本地事务的最终一致性。 RocketMQ的分布式事务又称为“半消息事务”。 事务消息处理流程 RocketMQ是靠半消息机制实现分布式事务 事务消息&#x…

Spring之AOP源码解析(上)

Aop相关注解 EnableTransactionManagementEnableAspectJAutoProxyEnableAsync... 从注解切入来看看这些注解都干了什么 Import注解作用简述 注入的类一般继承ImportSelector或者ImportBeanDefinitionRegistrar接口 继承ImportSelector接口&#xff1a;selectImports方法返回…

pandas/geopandas 笔记:判断地点在不在路网上 不在路网的点和路网的距离

0 导入库 import osimport pandas as pd pd.set_option(display.max_rows,5)import osmnx as oximport geopandas as gpd from shapely.geometry import Point 1 读取数据 假设我们有 如下的数据&#xff1a; 1.1 新加坡室外基站位置数据 cell_stationpd.read_csv(outdoor…

TSINGSEE青犀AI智能分析网关V4初始配置与算法相关配置介绍

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;上报识别结果&#xff0c;并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入&#xff0c;可兼容市面上常见…

通过例子学习golang的Goroutine

Go 语言中的 Goroutine 是一种轻量级的并发执行单位。它可以与其他 Goroutine 并发地执行&#xff0c;而不需要显式地管理线程的创建和销毁。Goroutine 是 Go 语言并发模型的核心组成部分&#xff0c;它使得编写并发程序变得更加简单和高效。 例一 创建两个function&#xff0…

linux下ffmpeg调用GPU硬件解码(VDPAU/VAAPI)保存文件

本文讲解在linux下面&#xff0c;如何通过ffmpeg调用GPU硬件解码&#xff0c;并保存解码完的yuv文件。 其实&#xff0c;ffmpeg自带的例子hw_decode.c这个文件&#xff0c;就已经能满足要求了&#xff0c;因此&#xff0c;本文就尝试讲解以下hw_decode这个例子。hw_decode.c可以…

watchpoint

前言 内存被踩&#xff0c;通过 watchpoint 找到真凶 实例 以 smsc911x 网卡驱动为基体&#xff0c;进行实验&#xff0c;和网卡本身功能无关&#xff0c; 每执行一次 ifconfig eth0 up&#xff0c;就会调用一次 smsc911x_open()&#xff0c;我在这里设计了一段代码&#xf…

数学知识(四)(容斥原理、博弈论)

一、容斥原理 容斥原理公式 一共加或者减的式子个数 &#xff08;一&#xff09;利用容斥原理解决求能被质数整除的数的个数 890计算能被整除的数的个数 因为一共有2^n-1种选法&#xff0c;可以用位运算的方式枚举&#xff0c;对于得到的每一种选法&#xff0c;根据存在的数…

六、回归与聚类算法 - 逻辑回归与二分类

线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、应用场景 2、原理 2.1 输入 2.2 激活函数 3、损失以及优化 3.1 损失 3.2 优化 4、逻辑回归API 5、分类的评估方法 5.1 精确率和召回率 5.2…

找出作弊的人

文章目录 题目描述输入描述输出描述样例1解释:样例2代码 题目描述 公司组织了一次考试,现在考试结果出来了&#xff0c;想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。 过滤的规则为:找到分差最小的员工ID对(p1,p2)列表…

【Spring】IoC容器 控制反转 与 DI依赖注入 配置类实现版本 第四期

文章目录 基于 配置类 方式管理 Bean一、 配置类和扫描注解二、Bean定义组件三、高级特性&#xff1a;Bean注解细节四、高级特性&#xff1a;Import扩展五、基于注解配置类方式整合三层架构组件总结 基于 配置类 方式管理 Bean Spring 完全注解配置&#xff08;Fully Annotatio…

Kotlin学习 6

1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…

C语言读取 ini 配置文件,修改/添加键值对

C语言读取 ini 配置文件&#xff0c;修改/添加键值对 C语言读取 ini 配置文件&#xff0c;对section中的键值对进行修改/添加&#xff0c;如果section不存在&#xff0c;则在末尾将新的section/key/value 添加进去。 一、了解什么是INI文件&#xff1f; ini 文件是Initializ…

【大数据】Flink 之部署篇

Flink 之部署篇 1.概述和参考架构2.可重复的资源清理3.部署模式3.1 Application 模式3.2 Per-Job 模式&#xff08;已废弃&#xff09;3.3 Session 模式 Flink 是一个多用途框架&#xff0c;支持多种不同的混合部署方案。下面&#xff0c;我们将简要介绍 Flink 集群的构建模块、…

流动资金贷款管理办法

流动资金贷款管理办法 (2024年1月30日国家金融监督管理总局令2024年第2号公布 自2024年7月1日起施行) 第一章 总 则 第一条 为规范银行业金融机构流动资金贷款业务经营行为&#xff0c;加强流动资金贷款审慎经营管理&#xff0c;促进流动资金贷款业务健康发展&#xff0c;依…

【html学习笔记】3.表单元素

1.文本框 1.1 语法 <input type "text">表示文本框。且只能写一行 1.2 属性 使用属性size 设置文本框大小 <input type"text" size"10">2. 使用属性value 来设置文本框的默认文字 <input type"text" size"…