题解:CF1889A Qingshan Loves Strings 2

题目链接

题意

我们称长度为 $k$ 的 $\texttt{01}$ 串 $a$ 是好的当且仅当

  • $\forall i\in\left[1,k\right],a_i\ne a_{k-i+1}$

现在给你 $t$ 个 $\texttt{01}$ 串 $s$,你可以执行不多于 $300$ 次以下操作使得 $s$ 变为好的(次数可以为 $0$):

  • $\text{插入}\texttt{01}\text{到}s\text{的任意位置}$

对于每个 $\texttt{01}$ 串 $s$,若无法使它变好,则输出 $-1$;否则输出操作次数和每次插入的位置 $x_i$(当 $x_i=0$ 时表示插入到 $s$ 的开头,否则表示插入到 $s_i$ 的后面)。

思路

首先,一个 $\texttt{01}$ 串 $s$ 如果是好的,则它的 $0$ 和 $1$ 的个数应该相等(这是因为 $s_i$ 和 $s_{k-i+1}$ 中必须一个是 $0$,一个是 $1$)。

又因为插入 $\texttt{01}$ 不能使 $s$ 中 $0$ 和 $1$ 的个数由不相等变为相等。
因此我们可以统计 $s$ 中 $0$ 和 $1$ 的个数,若不相等则直接输出 $-1$,否则要继续寻找方案。

我们可以使用双指针 $i$ 和 $j$ 遍历字符串 $s$:

  • 当 $s_i=s_j=0$ 时,我们可以将 $\texttt{01}$ 插入到 $s_j$ 的后面。
  • 当 $s_i=s_j=1$ 时,我们可以将 $\texttt{01}$ 插入到 $s_i$ 的前面。
  • 当 $s_i\ne s_j$ 时,则不做处理。

用一个变量记录插入的次数,用一个数组记录插入的位置,最后输出即可。

例如,对于第 $4$ 组样例,模拟的情况如下(字符串中标红的为 $i$ 和 $j$ 的位置):

  • $s=\texttt{\textcolor{red}{0}0111\textcolor{red}{0}}$,$i=1$,$j=6$,$s_i=s_j=0$,在 $s_j$ 后插入 $\texttt{01}$。

  • $s=\texttt{0\textcolor{red}{0}1110\textcolor{red}{0}1}$,$i=2$,$j=7$,$s_i=s_j=0$,在 $s_j$ 后插入 $\texttt{01}$。

  • $s=\texttt{00\textcolor{red}{1}1100\textcolor{red}{0}11}$,$i=3$,$j=8$,$s_i\ne s_j$,跳过。

  • $s=\texttt{001\textcolor{red}{1}10\textcolor{red}{0}011}$,$i=4$,$j=7$,$s_i\ne s_j$,跳过。

  • $s=\texttt{0011\textcolor{red}{1}\textcolor{red}{0}0011}$,$i=5$,$j=6$,$s_i\ne s_j$,结束。

因此输出结果为:

2
6 7

程序

#include<bits/stdc++.h>
using namespace std;
int t,len,sum0,sum1,ans,arr[300];//t为组数,len为字符串的长度,sum0、sum1分别为字符串中0、1的个数,ans为操作次数,arr[]存储插入的位置 
char str[702];//str[]存储字符串 
void solve(){sum0=sum1=ans=0;//初始化 scanf("%d%s",&len,str+1);//读入len和str[] for(int i=1;i<=len;++i){//统计0和1的个数 if(str[i]=='0')++sum0;else ++sum1;}if(sum0!=sum1){//如果不相等,输出-1并返回 printf("-1\n");return;}for(int i=1,j=len;i<j;){if(str[i]=='0'&&str[j]=='0'){ arr[ans++]=j;//记录插入位置 for(int k=len+1,l=len+3;k>j;--k,--l)str[l]=str[k];//在str[j]后插入01 str[j+1]='0',str[j+2]='1';len+=2,++i,++j;//增加长度,移动指针 }else if(str[i]=='1'&&str[j]=='1'){arr[ans++]=i-1;//记录插入位置 for(int k=len+1,l=len+3;k>=i;--k,--l)str[l]=str[k];//在str[i]前插入01,就是在str[i-1]后插入01 str[i]='0',str[i+1]='1';len+=2,++i,++j;//增加长度,移动指针 }else ++i,--j;//移动指针 }printf("%d\n",ans);//输出ansfor(int i=0;i<ans;++i)printf("%d ",arr[i]);//输出arr[] printf("\n");
}
int main(){scanf("%d",&t);//输入组数for(int i=0;i<t;++i)solve();//解决问题 return 0;
}

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

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

相关文章

VMware ESXi 6.7U3v macOS Unlocker OEM BIOS 2.7 集成 Realtek 网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 集成 Realtek 网卡驱动和 NVMe 驱动 (集成驱动版)VMware ESXi 6.7U3v macOS Unlocker & OEM BIOS 2.7 集成 Realtek 网卡驱动和 NVMe 驱动 (集成驱动版) 此版本解决的问题:VMware Host Client 无法将现有虚拟磁盘 (…

读DAMA数据管理知识体系指南14数据库环境

读DAMA数据管理知识体系指南14数据库环境1. ACID 1.1. 缩写词ACID是在20世纪80年代末期出现的一个合成词,含义是保证数据库事务可靠性不可或缺的约束 1.2. 原子性(Atomicity)1.2.1. 所有操作要么都完成,要么一个也不完成1.2.2. 如果事务中的某部分失败,那么整个事务就都会失…

opera在搜索引擎页面,无法使用用户脚本

如图只要是搜索结果页面都不能激活扩展。 我使用了链接助手这个在任何页面都能使用的脚本只有暴力猴提了一嘴,搜索引擎上完全搜索不到类似的问题。我在设置中找了半天,并没有找到类似权限的字样。于是去找了github的issue。 最终误打误撞的 https://github.com/dhowe/AdNause…

python第一天

内容目录 1.python语法注释标注就是对代码进行解释 -方式一:加井号例如#巴拉巴拉即可 -方式二:英文输入法连按三下单引号即可 -方式三:英文输入法连按三下shift+引号""""""即可 例如:2.变量与常量python中没有固定的常量,常量即时变量只不过…

Trae中git bash异常

情况 我装上Trae的时候,电脑的终端出现了很多问题,首先是PATH环境变量,某些变量由于空格等原因被阻隔。git bash环境变量 echo $PATH /c/Users/acer/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/c/Users/acer/AppData/Local/Programs/Trae/resources/app/bin:undefined…

KDE+wayland的Arch初始化

前言 arch的中文百科,很多时候能派上用场,或者善用bing和AI。 https://wiki.archlinuxcn.org/wiki/Wayland 下面这是我用的系统。 https://endeavouros.com/ 劝退如果对linux没有执着,建议还是用windows。linux作为非商业的系统,很多软件只会出win版和mac版本。linux系统分…

AI PPT与AI 文章写作

1. AI文章豆包AI写文章官网例子 deepseek和ima(基于知识库问答:方便参考文献),和波尔学术(学术绘图),和糖果果AI(学术绘图)视频来源:`全网最全deepseek科研使用指南|AI写论文避坑指南!`脑图总结(利用包阅AI总结视频)文章去除AI味视频来源:抖音@抖音科技 - 如何去…

01-计算机网络引入

目录计算机网络分类按范围进行分类按使用者分类互联网和互联网络一样吗?互联网的边缘部分和核心部分什么是ISP电路交换 & 分组交换网络性能指标速率带宽(bandwidth)吞吐量(Throughput)时延(Delay或Latency)发送时延(传输时延)传播时延处理时延排队时延总时延丢包率…

Spring -- 进阶

IOC/DI配置管理第三方bean 管理druid数据源pom.xml引入依赖<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency&g…

基于生物地理算法的MLP多层感知机优化matlab仿真

1.程序功能描述 基于生物地理算法的MLP多层感知机优化matlab仿真,完成随机数据点的趋势预测,并输出优化收敛曲线。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序% 迭代训练 for i = 1:1000wdh = (wdo(:, 2:end) .* ((1-yh…

【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章:《基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR》的硬件测试版本。在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运行后…

python第一章课后习题

str1 = input("请输入一个人的名字:") str2 = input("请输入一个国家名字:") print("世界这么大,{}想去{}看看.".format(str1,str2)) n = input("请输入整数N:") sum = 0 for i in range(int(n)): sum += i + 1 print("1到N之…