K. 子串翻转回文串

devtools/2024/10/10 15:19:40/

给一个串 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.ppmy.cn/devtools/35013.html

相关文章

vue2 webpack-dev-server Unknown promise rejection reason

在vue.config.js中添加如下配置&#xff0c;重启项目即可 module.exports defineConfig({devServer: {client: {overlay: false,},} })参考

Java类和对象

一 、类的声明 &#xff08;1&#xff09;类的概念 类是对对象的抽象描述&#xff0c;对象是表示某个具体的事物。类作为一个抽象的数据类型&#xff0c;用来描述相同类型的对象的属性和行为。如将人抽象为一个类&#xff0c;张三就是这个类的一个实例&#xff08;对象&#xf…

【C++】stack、queue和priority_queue的模拟实现

在本篇博客中&#xff0c;作者将会讲解STL中的stack、queue和priority_queue的模拟实现&#xff0c;同时还会带大家了解一下deque这个容器。 一.什么是适配器 STL中一共有6大组件&#xff1a;容器&#xff0c;适配器&#xff0c;空间配置器&#xff0c;仿函数&#xff0c;迭代器…

从0开始的数据结构的书写-------线性表(顺序表)

&#xff08;复习考研的休息区&#xff0c;心血来潮&#xff0c;写点代码&#xff09; 三个规则&#xff1a; 1、不使用c stl库进行书写 2、最好基于严蔚敏老师的数据结构 3、最好使用malloc和realloc动态分配内存 &#xff08;如果有问题&#xff0c;请大家看看&#xff…

【项目部署】手把手带你从零部署项目:宝塔 + uwsgi + Django + 腾讯云 + Websocket

1. 前言 哈喽&#xff0c;大家好&#xff0c;我是jiaoxingk。今天带来的是有关Django项目部署的教程。 当我们完成了一个项目作品之后&#xff0c;我们肯定会迫不及待的就准备上线部署啦&#xff0c; 这篇教程将带你从服务器的配置选购&#xff0c;再通过安装宝塔的形式进行项目…

springboot+websocket开发简单的在线群聊聊天web版本

springbootwebsocket开发简单的在线群聊聊天web版本&#xff01;近期在测试websocket插件的群聊功能。下面是一个简单的demo。分享给大家&#xff0c;亲测可以使用的。 1&#xff1a;首先是一个chat.html页面。代码如下&#xff1a; <!DOCTYPE html> <html lang"…

RK3568 学习笔记 : 精简 u-boot env 默认复杂的多种引导启动设置

前言 环境&#xff1a; 正点原子 Atompi-CA1 RK3568 开发板、正点原子 DLRK3568 开发板&#xff0c;&#xff08;一时脑热买了两块 RK3568 开发板&#xff09;&#xff0c;Atompi-CA1 RK3568 开发板比较小巧&#xff0c;利于一些前期的嵌入式 Linux 开发学习与实践。 RK3568 开…

【考研数学】武忠祥「基础篇」如何衔接进入强化?

如果基础篇已经做完&#xff0c;并且讲义上的例题也都做完了&#xff0c; 那下一步就是该做题了 这个时候&#xff0c;不能盲目做题&#xff0c;做什么题很重要&#xff01;我当初考研之前&#xff0c;基础也很差&#xff0c;所以考研的时候选了错误的题集&#xff0c;做起来就…