题解:CF1951E(No Palindromes)

题解:CF1951E(No Palindromes)

题目翻译:给定一个长度为 n n n 的字符串 s s s,询问是否可以将其分成若干份,使得每一份都不是回文串。若可以,输出 YES 并给出任意一组方案;若不可以,则直接输出 NO。其中,数据多测,共 t t t 组,保证 ∑ n ≤ 1 0 6 \sum n\leq10^6 n106

先观察数据范围1e6 级别,基本上就是 O ( n ) O(n) O(n) 的,看来是一道结论题

为了之后表述方便,我们不妨将字符串分成若干个部分,使得每个部分中的字符都相同相邻两个部分的字符不相等。记这样的部分数为 c n t cnt cnt,记第 i i i 个部分为 x i x_i xi

于是,我们开始分情况讨论:

  • c n t cnt cnt偶数时,不难证明,整个字符串一定不是一个回文串,因此可以分,整体分成一份即可。当然,我们将它的奇数段和偶数段两两搭配分在一起也是可以的。
  • c n t = 1 cnt=1 cnt=1 时,显然无论怎么分,每一段内的字母都一定相同,因此不可以分。
  • c n t cnt cnt奇数 1 1 1 除外)时,我们要想能分成,要么将奇数个段(显然 1 1 1 除外)分在一起,要么将某一段拆开,还需要继续分类:
    • 当存在 1 ≤ i ≤ c n t − 2 1\leq i\leq cnt-2 1icnt2,使得 x i = x i + 2 x_i=x_{i+2} xi=xi+2 时,那一定可以分(就是用第 i d id id i d + 1 id+1 id+1 i d + 2 id+2 id+2 段组成前面所说的“奇数个段”),但是怎么分还要分类(记我们找到的其中任意一个 i i i i d id id):
      • i d id id偶数时,在第 i d id id之前有偶数个段,我们将其奇数段和偶数段两两搭配;对于中间,我们将第 i d id id i d + 1 id+1 id+1 i d + 2 id+2 id+2 段分在一起;对于第 i d + 2 id+2 id+2 之后也有偶数个段,我也是时将其奇数段和偶数段两两搭配
      • i d id id奇数时,在第 i d − 1 id-1 id1之前有偶数个段,我们将其奇数段和偶数段两两搭配;对于中间,我们将第 i d − 1 id-1 id1 i d id id i d + 1 id+1 id+1 i d + 2 id+2 id+2 i d + 3 id+3 id+3 段分在一起;对于第 i d + 3 id+3 id+3 之后也有偶数个段,我也是时将其奇数段和偶数段两两搭配
    • 当不存在 1 ≤ i ≤ c n t − 2 1\leq i\leq cnt-2 1icnt2,使得 x i = x i + 2 x_i=x_{i+2} xi=xi+2 时,给定字符串一定是由两种段交替组成的,我们需要继续分类(记其中第奇数段的字符数量为 u u u,第偶数段的字符数量为 v v v):
      • u = v = 1 u=v=1 u=v=1 时,由于总段数 c n t cnt cnt奇数,而任何一段都不可能拆成两半,因此最终的字符串一定被分成两份,分别有奇数个段和偶数个段组成,显然那个由奇数个段组成的一部分一定是回文串,因此不可以分。
      • v ≠ 1 v\neq 1 v=1 时,第 2 2 2 段可以被拆成两半,因此可以分,将其第一个字符与前面的第 1 1 1 段分成一部分,第 2 2 2 段的剩余的部分与它右侧所有剩余字符分成另一部分。
      • v = 1 v=1 v=1 u ≠ 1 u\neq 1 u=1 时,再分情况:
        • c n t = 3 cnt=3 cnt=3 时,只有第 1 1 1 段和第 3 3 3 段可以拆开,此时一定有一部分中所有字符相同,因此不能分。
        • c n t > 3 cnt>3 cnt>3 时,将第 3 3 3 部分拆成两半,就可以分,分法与上面的“当 v ≠ 1 v\neq 1 v=1 时”类似,这里不再赘述。

于是,我们通过一大片子的分类讨论解决了这道题。

还是给个代码吧!

#include<bits/stdc++.h>
#define N 1100000
#define fors(i,b,e) for(int i=b;i<=e;i++)
#define fst first
#define scd second
#define pb push_back
using namespace std;
int t;
char s[N];
int n;
pair<char,int>x[N];
bool operator==(pair<char,int>x,pair<char,int>y);
int main(){scanf("%d",&t);while(t--){scanf("%s",s+1);n=strlen(s+1);int cnt=0;fors(i,1,n){if(i==1||s[i]!=s[i-1])cnt++,x[cnt]={s[i],1};else x[cnt].scd++;}if(cnt%2==0)printf("YES\n1\n%s\n",s+1);else if(cnt==1)printf("NO\n");else{int id=0;fors(i,1,cnt-2)if(x[i]!=x[i+2]){id=i;break;}if(id!=0){if(id%2==1){printf("YES\n%d\n",cnt/2);for(int i=1;i+1<id;i+=2){fors(j,1,x[i+0].scd)printf("%c",x[i+0].fst);fors(j,1,x[i+1].scd)printf("%c",x[i+1].fst);printf(" ");}fors(i,0,2)fors(j,1,x[id+i].scd)printf("%c",x[id+i].fst);printf(" ");for(int i=id+3;i+1<=cnt;i+=2){fors(j,1,x[i+0].scd)printf("%c",x[i+0].fst);fors(j,1,x[i+1].scd)printf("%c",x[i+1].fst);printf(" ");}printf("\n");}else{printf("YES\n%d\n",cnt/2-1);for(int i=1;i+1<id-1;i+=2){fors(j,1,x[i+0].scd)printf("%c",x[i+0].fst);fors(j,1,x[i+1].scd)printf("%c",x[i+1].fst);printf(" ");}fors(i,-1,3)fors(j,1,x[id+i].scd)printf("%c",x[id+i].fst);printf(" ");for(int i=id+4;i+1<=cnt;i+=2){fors(j,1,x[i+0].scd)printf("%c",x[i+0].fst);fors(j,1,x[i+1].scd)printf("%c",x[i+1].fst);printf(" ");}printf("\n");}}else{int u=x[1].scd,v=x[2].scd;if(u==1&&v==1)printf("NO\n");else if(v!=1){printf("YES\n2\n");fors(i,1,u)printf("%c",x[1].fst);printf("%c ",x[2].fst);fors(i,2,v)printf("%c",x[2].fst);fors(i,3,cnt)fors(j,1,x[i].scd)printf("%c",x[i].fst);printf("\n");}else{if(cnt==3)printf("NO\n");else{printf("YES\n2\n");fors(i,1,u)printf("%c",x[1].fst);fors(i,1,v)printf("%c",x[2].fst);printf("%c ",x[3].fst);fors(i,2,u)printf("%c",x[3].fst);fors(i,4,cnt)fors(j,1,x[i].scd)printf("%c",x[i].fst);printf("\n");}}}}}return 0;
}
bool operator==(pair<char,int>x,pair<char,int>y){return x.fst==y.fst&&x.scd==y.scd;
}

注意
如果你信心满满地写了一个自以为十分正确的代码提交上去却 Wrong answer on test 2,请不要恼火,慢慢核对,看看有没有哪里写错了,相信你能调对!

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

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

相关文章

【BASH 常用脚本系列3 -- shell实现查找目录并进入目录】

文章目录 shell实现查找目录并进入目录脚本实现shell实现查找目录并进入目录 在linux中终端下工作,如果要进入一个深度很深的目录的话需要 cd ./xx/xx./.. 执行很多次,用起来很麻烦,有些人就建议使用autojump来实现,但是autojump 的一个缺点是:如果本地有多套代码,只是它…

计算机英文论文常见错误写作习惯3

目录 第一部分 Numbers and Equations ‘such as’ and ‘etc.’ 第二部分 第一部分 Numbers and Equations 两个非常常见的错误是关于阿拉伯数字和方程式的表示。中国作家通常写阿拉伯数字&#xff0c;而不是拼出单词。然而&#xff0c;使用阿拉伯数字本身并不是一个错误…

【Shell】part1-Shell-基础入门篇

part1-基础入门 HelloWorld 创建,编写,运行 Shell 脚本 vim test.sh#!/bin/bash echo "Hello World !"# 1.作为可执行程序运行 chmod ax ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本# 2.作为解释器参数运行 /bin/sh test.sh /bin/php test.php变量 变…

【Python】 逻辑回归:从训练到预测的完整案例

我把我唱给你听 把你纯真无邪的笑容给我吧 我们应该有快乐的 幸福的晴朗的时光 我把我唱给你听 用我炙热的感情感动你好吗 岁月是值得怀念的留恋的 害羞的红色脸庞 谁能够代替你呀 趁年轻尽情的爱吧 最最亲爱的人啊 路途遥远我们在一起吧 &#x1f3b5; 叶…

如何利用STM32F103实现太阳板的光线追踪

如何利用STM32F103实现太阳板的光线追踪 太阳能发电效率的提升一直是绿色能源领域的研究热点。通过太阳板的光线追踪技术&#xff0c;我们可以确保太阳板始终面向太阳&#xff0c;从而最大化其接收阳光的面积&#xff0c;提高能源转换效率。本文将介绍如何利用STM32F103微控制…

Redis第15讲——RedLock、Zookeeper及数据库实现分布式锁

由于篇幅原因&#xff0c;在上篇文章我们只介绍了redis实现分布式锁的两种方式——setnx和Redission&#xff0c;并对Reidssion加锁和看门狗机制的源码进行了分析&#xff0c;但这两种方案在极端情况下都会出现或多或少的问题。那么针对上述问题&#xff0c;比较主流的解决方案…

Linux服务器基本操作

Linux下服务器基本操作指令 Vim 文件名 进入 i编辑 esc退出编辑 &#xff1a;wq 保存退出 Cp -r文件夹 path 完整或…/ Cp 文件 path pwd 查看当前目录 rm -rf 2005 删除文件夹 Mkdir 创建文件夹 squeue查看提交队列 tail -f rsl.out.0000 在运行当前目录下查看进度 Scancel j…

用Scrapy 从数据挖掘到监控和自动化测试

Scrapy 是一个 BSD 许可的快速高级网络爬虫和网络抓取框架&#xff0c;用于抓取网站并从其页面中提取结构化数据。它可以用于广泛的用途&#xff0c;从数据挖掘到监控和自动化测试。 安装scrapy pip install scrapy 爬虫示例 示例代码写入文件 import scrapyclass QuotesSp…

Kylin Linux V10 SP1 aarch64部署k8s集群严重bug

目录 1.部署方式 2.遇到问题 3.问题解决 1.部署方式 通过sealos方式部署 2.遇到问题 适配Kylin Linux V10 SP1 aarch64部署pod 不少出现CrashLoopBackOff 通过命令: kubectl describe pod xxx -n default 查看,发现报错如下: Error response from daemon: OCI …

简约大气的全屏背景壁纸导航网源码(免费)

简约大气的全屏背景壁纸导航网模板 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html> <html lang"zh-CN"> <!--版权归孤独 --> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible…

工厂模式和策略模式区别

工厂模式和策略模式都是面向对象设计模式&#xff0c;但它们的目的和应用场景有所不同。 工厂模式是一种创建型设计模式&#xff0c;旨在通过使用一个工厂类来创建对象&#xff0c;而不是直接使用new关键字来创建对象。这样做可以使系统更容易扩展和维护&#xff0c;因为新的对…

图论之最短路算法模板总结

来个大致的分类&#xff1a; 朴素的迪杰斯特拉&#xff1a; 实现&#xff1a; 我们让s表示当前已经确定的最短距离的点&#xff0c;我们找到一个不在s中的距离最近的点t&#xff0c;并用t来更新其他的点。 下面是AC代码&#xff1a; #include<bits/stdc.h> using nam…

C语言-整体内容简单的认识

目录 一、数据类型的介绍二、数据的变量和常量三、变量的作用域和生命周期四、字符串五、转义字符六、操作符六、常见的关键字6.1 关键字static 七、内存分配八、结构体九、指针 一、数据类型的介绍 sizeof是一个操作符&#xff0c;是计算机类型/变量所占内存空间的大小   sc…

中间件之异步通讯组件RabbitMQ入门

一、概述 微服务一旦拆分&#xff0c;必然涉及到服务之间的相互调用&#xff0c;目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中&#xff0c;调用者发起请求后需要等待服务提供者执行业务返回结果后&#xff0c;才能继续执行后面的业务。也就是说调用者在调用…

Java IO流(二)

1. 缓冲流 1.1 字节缓冲流概述 当对文件或其他数据源进行频繁的读/写操作时&#xff0c;效率比较低&#xff0c;这时如果使用缓存流就能够更高效地读/写信息。 比如&#xff0c;可以使用缓冲输出流来一次性批量写出若干数据减少写出次数来提高写出效率。 如果用生活中的例子做…

使用qemu调试NVME driver

参考nvme驱动相关的博客&#xff0c;可以使用qemu buildroot进行nvme驱动的流程debug。 一、QEMU编译 首先需要编译qemu&#xff0c;可以参考QEMU编译。wget下载最新版本的QEMU&#xff0c;编译之前&#xff0c;最好检查下依赖包是否安装&#xff0c;避免安装过程出现各种错…

Qwen-Audio:推动通用音频理解的统一大规模音频-语言模型(开源)

随着人工智能技术的不断进步&#xff0c;音频语言模型&#xff08;Audio-Language Models&#xff09;在人机交互领域变得越来越重要。然而&#xff0c;由于缺乏能够处理多样化音频类型和任务的预训练模型&#xff0c;该领域的进展受到了限制。为了克服这一挑战&#xff0c;研究…

【WebGL】修改阴影体形状,实现相交分析

阴影体&#xff08;Shadow Volume&#xff09;技术是计算机图形学中实现阴影的重要方式&#xff0c;除了用于可视化阴影效果外&#xff0c;阴影体还能实现线、面等要素的贴地、贴对象显示。在用阴影体贴地、贴对象时&#xff0c;大多数情况下我们都会认为阴影体是一个带有高度的…

OpenCV的图像矩(64)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何为等值线创建边界旋转框和椭圆(63) 下一篇 &#xff1a;OpenCV4.9的点多边形测试(65) Image Moments&#xff08;图像矩&#xff09;是 OpenCV 库中的一个功能&#xff0c;它可…

神经网络中常见的激活函数:理解与实践

神经网络中常见的激活函数&#xff1a;理解与实践 在神经网络中&#xff0c;激活函数是一个非常重要的组成部分&#xff0c;它为神经元引入了非线性特性&#xff0c;使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数&#xff0c;包括它们的概述、公式以及…