K. 子串翻转回文串

news2024/9/23 15:31:43

给一个串 s = s1s2... sn,你可以选定其一个非空子串,然后将该子串翻转。具体来说,若选定的子串区间为 [l, r](1 ≤ l ≤ r ≤ n),则翻转后该串变为 s1s2... sl - 1srsr - 1... slsr + 1... sn

请你回答仅通过一次上述操作后,s 是否能变成回文串。串 s 是回文串,当且仅当它从左至右读出与从右至左读出完全相同,即 s1s2... sn = snsn - 1... s1。

解析:

我们只需要找到不对称的那一部分在进行每一位反转,这时候我们可以用 O(1)的时间复杂度进行优化。hash函数。

公式:get(l,r) - get(l,i)*p[r -i] + get2(l,i)*p[r-i] 其中 p[r - i ]是 进行了 p倍

#include<bits/stdc++.h>
#define ull int
typedef long long ll;
using namespace std;
const int mod = 1e9+7;
const int N=5e5+7;
int n,m,k;
char str[N];
int h1[N],h2[N],p[N];
 
void init() {
	p[0]=1;
	for(int i=1;i<=500000;i++) p[i]=(ll)p[i-1]*131%mod;
}
 
void init(int l,int r) {	
	h1[l-1]=0;
	for(int i=l;i<=r;i++) {
		h1[i]=((ll)h1[i-1]*131+str[i])%mod;
	}
	
	h2[r+1]=0;
	for(int i=r;i>=l;i--) {
		h2[i]=((ll)h2[i+1]*131+str[i])%mod;
	}
}
 

int get1(int l,int r) {
	return ((h1[r]-(ll)h1[l-1]*p[r-l+1]%mod)+mod)%mod;
}
 
int get2(int l,int r) {
	return ((h2[l]-(ll)h2[r+1]*p[r-l+1])%mod+mod)%mod;
}
 
bool check1(int l,int r,int i) {
	int hs1=(((ll)get1(l,r)-(ll)get1(l,i)*p[r-i]+(ll)get2(l,i)*p[r-i])%mod+mod)%mod;
	int hs2=(((ll)get2(l,r)-(ll)get2(l,i)+(ll)get1(l,i))%mod+mod)%mod;
 
	return hs1==hs2;
}
 
bool check2(int l,int r,int i) {
	int hs1=(((ll)get1(l,r)-(ll)get1(i,r)+(ll)get2(i,r))%mod+mod)%mod;
	int hs2=(((ll)get2(l,r)-(ll)get2(i,r)*p[i-l]+(ll)get1(i,r)*p[i-l])%mod+mod)%mod;
 
	return hs1==hs2;
}
 



void solve()
{
	scanf("%s",str+1);
	n=strlen(str+1);
	int l=1,r=n;
	while(l<=r&&str[l]==str[r]) l++,r--;
	
	if(l>r) {
		printf("Yes\n");
		return ;
	}
	
	init(l,r);
	
	bool flag=false;
	for(int i=l;i<r;i++) {
		if(check1(l,r,i)) flag=true;
		if(flag) break;
	}
	
	for(int i=r;i>l;i--) {
		if(check2(l,r,i)) flag=true;
		if(flag) break;
	}
	
	if(flag) printf("Yes\n");
	else printf("No\n");
	
}
int main()
{
	init();
	int t; 
	cin >> t;
	while(t--)
	{
		solve();
	}
	
	return 0;
 } 

时间复杂度为:O(n);

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

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

相关文章

【企业动态】爱尔兰客户到访东胜物联,共拓能源管理等解决方案

近日&#xff0c;来自爱尔兰的房屋数据监测客户莅临东胜物联&#xff08;杭州黄龙国际中心&#xff09;进行参观考察&#xff0c;双方就未来的广泛合作进行了深入的沟通交流。 来访期间&#xff0c;东胜物联CEO支江峰先生热情接待了客户&#xff0c;并陪同他们参观了产品展厅&…

C语言数组介绍

文章目录 一、数组的概念二、一维数组1.一维数组的创建2.一维数组的初始化3.数组的类型4.一维数组的使用5.一维数组在内存中的存储6.sizeof计算数组元素个数 三、二维数组1.二维数组的概念2.二维数组的创建3.二维数组的初始化4.二维数组的使用5.二维数组的输入和输出6.二维数组…

Linux主机重启后报错:[FAILED] Failed to start Switch Root.

一、问题描述 某次云主机因计费问题&#xff0c;导致批量重启&#xff0c;重启后发现某台云主机竟进入紧急救援模式&#xff08;emergency模式&#xff09;&#xff0c;如下所示&#xff1a; 二、原因及处理 1&#xff09;原因&#xff1a;加载根分区失败&#xff0c;导致无…

文字转语音软件下载教程

文字转语音软件下载教程 一&#xff0c;Whisper下载二&#xff0c;ggml-medium语言模型下载三&#xff0c;导入模型下载四&#xff0c;使用方法 一&#xff0c;Whisper下载 网址&#xff1a;https://bittly.cc/uL9xs 下拉选择&#xff1a; 进入下载页面&#xff0c;下载Whis…

笔记:编写程序,绘制一个展示支付宝月账单报告的饼图

文章目录 前言一、饼图是什么&#xff1f;二、编写代码总结 前言 笔记&#xff1a;编写程序&#xff0c;绘制一个展示支付宝月账单报告的饼图 &#xff08;1&#xff09; 导入 matplotlib.pyplot 模块&#xff1b; &#xff08;2&#xff09; 准备饼图所需的数据&#xff1b; …

【设计模式】创建者模式之 工厂方法 抽象工厂

工厂方法模式(Factory Method) 一个特定功能&#xff0c;往往有多种实现方式&#xff0c;但是很难有某一个实现可以适用于所有情况&#xff0c;因此往往需要根据特定的场景选择不同的实现。试想&#xff1a;把选择具体实现的代码放在业务中会发生什么&#xff1f;每当我们需要…

压缩png图片大小怎么操作?试试这招一键压缩图片体积

png图片是一种无损压缩格式&#xff0c;体积也会比其他格式的图片要大。但是&#xff0c;我们在使用的过程中遇到需要给png图片压缩体积的情况时要怎么办呢&#xff1f;很简单&#xff0c;只需要使用png压缩大小&#xff08;https://www.yasuotu.com/png&#xff09;网站-压缩图…

SuperMap GIS基础产品FAQ集锦(20240429)

一、SuperMap iServer 问题1&#xff1a;咨询一下&#xff0c;正式许可插上后&#xff0c;出现这样的提示。可能是哪方面的原因呢&#xff1f; 11.1.1 【问题原因】虚拟机环境读取USB设别需要设置USB映射 【解决办法】虚拟平台重新进行USB映射操作后能正常读取许可 问题2&a…

【数字图像处理笔记】Matlab实现图像平滑算法 均值-中值-高斯滤波 (三)

&#x1f48c; 所属专栏&#xff1a;【数字图像处理笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x…

Obsidium v1.5.4壳 逆向分析

样本是使用这个壳进行打包的 来进行逆向 进入X32 DBG中 进来一看就是经典花指令 混淆解析器 可以在CE中查找指令地址 来得到当前真正执行的指令 对SEH链进行劫持 马上就来个int 1进入异常处理函数 无视异常 直接进去 观察Zwcontinue函数传进去的Context结构体 结构体偏移…

HFP event

0 Preface/Foreword NOTE&#xff1a;在来电提示音在响时候&#xff0c;每3s会进入一次。 也就是说&#xff1a;协议栈&#xff0c;没3s会调用一次app_hfp_event_callback。 回调函数在hfp初始化时候通过btif_hf_register_callback注册。 提示音调节&#xff1a; iPhone6s iO…

Leetcode编程练习

面试题-消失的数字 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& …

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候&#xff0c;Richard Li曾花费“巨资”请了华为前战略专家给我们培训&#xff0c;讲授IPD这门课的模式都很IPD&#xff0c;当时完全没重视&#xff0c;光想着不可能靠这个能把产品做好&#xff0c;这样做产品必定是一批…

RS2057XH功能和参数介绍及规格书

RS2057XH 是一款由润石科技&#xff08;Runic Semiconductor&#xff09;生产的模拟开关芯片&#xff0c;其主要功能和参数如下&#xff1a; 产品特点&#xff1a; 低电压操作&#xff1a;支持低至1.8V的工作电压&#xff0c;适用于低功耗应用。 高带宽&#xff1a;具有300MHz的…

Matlab 手写板设计

1、介绍 MATLAB手写板可以作为一个很好的数据输入口&#xff0c;其可以获取该手写板上任意字母、数字&#xff0c;甚至可以制作样本数据。具体用途体现在如下几方面&#xff1a; 数学公式输入&#xff1a;手写板允许用户直接用手写方式输入复杂的数学公式&#xff0c;这对于使…

C/C++ BM32 合并二叉树

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 树的题目大概率是要用到递归的&#xff0c;将一个树的问题拆分成子树的问题&#xff0c;不断拆分。 这题也用到了递归的思想。 题目 已知两颗二叉树&#xff0c;将它们合并成一颗…

基于springboot+vue+Mysql的租房网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Java17 --- SpringCloud之Nacos

目录 一、下载nacos并运行 1.1、创建9001微服务作为提供者 1.2、创建80微服务作为消费者 二、naocs配置中心规则与动态刷新 2.1、创建3377微服务 2.2、在nacos中创建配置文件 三、nacos数据模型之Namespace-Group-Datald 3.1、DatalD方案 3.2、Group方案 3.3、Name…

产业观察:电机驱动成为人形机器人的动力核心

前不久&#xff0c;波士顿动力发布一则“再见&#xff0c;液压Atlas”视频&#xff0c;宣告其著名的液压驱动双足人形机器人Atlas正式退役。这则视频引起全球所有Atlas粉丝的高度关注。然而紧接着&#xff0c;波士顿动力便又推出了全部由电机驱动的新一代Atlas机器人&#xff0…

数据结构相关

数据结构相关 文章目录 数据结构相关[TOC](文章目录)前言一、数据结构介绍二、不同的逻辑结构的存储方案(Java实现)2.1 线性结构&#xff1a;线性表、数组2.2 线性结构&#xff1a;栈2.3 线性结构&#xff1a;队列2.4 树形结构&#xff1a;树 三、一些常见的3.1 布隆过滤器Bloo…