Codeforces 1370 E

2023-10-30

题意: 给定两个 01 01 01序列 S S S T T T,可以选择 S S S中的子序列 s s s进行一次顺时针操作,即:
t s [ 1 ] = s [ 0 ] , t s [ 2 ] = s [ 1 ] , . . . , t s [ s . s i z e ( ) − 1 ] = s [ s . s i z e ( ) − 2 ] , t s [ 0 ] = t s [ s . s i z e ( ) − 1 ] ts[1] = s[0], ts[2]=s[1],...,ts[s.size()-1]=s[s.size()-2], ts[0]=ts[s.size()-1] ts[1]=s[0],ts[2]=s[1],...,ts[s.size()1]=s[s.size()2],ts[0]=ts[s.size()1]
然后 s = t s s=ts s=ts。问是否可以通过不断地操作使得 S = T S=T S=T,如果可以输出最小操作次数,否则输出 − 1 -1 1
题解: 无解的情况就是 S c n t [ 0 ] ≠ T c n t [ 0 ] Scnt[0] \neq Tcnt[0] Scnt[0]=Tcnt[0]或者 S c n t [ 1 ] ≠ T c n t [ 1 ] Scnt[1] \neq Tcnt[1] Scnt[1]=Tcnt[1]
之后,对于 S [ i ] = T [ i ] S[i]=T[i] S[i]=T[i]自然无需调整,所以我们将 S [ i ] ≠ T [ i ] S[i]\neq T[i] S[i]=T[i]的部分组成一个新的序列 s t r str str
对于 s t r str str存储的是 S [ i ] ≠ T [ i ] S[i]\neq T[i] S[i]=T[i] S [ i ] S[i] S[i]
需要了解的是:

  1. 可以知道, s t r str str 0 0 0 1 1 1的数量一定一样多,如果不一样多则无法得到 T T T。设 s t r c n t 0 = x , s t r c n t 1 = y strcnt0=x,strcnt1=y strcnt0=x,strcnt1=y,那么在对应的T中 s t r T c n t 0 = y , s t r T c n t 1 = x strTcnt0=y,strTcnt1=x strTcnt0=y,strTcnt1=x,所以 x = y x=y x=y,即两者数量一定相等。

  2. 可以知道,每次操作一定选择的是 010101...01 010101...01 010101...01 101010...10 101010...10 101010...10
    因为 S S S中对应的 0 0 0对应 T T T中的1,所以我们每次需要把 s t r str str中的 0 0 0 1 1 1调换位置,进行一次顺时针移动后就可以得到当前选择的序列中各个元素相较于移动前都发生了改变,即 0 → 1 , 1 → 0 0→1,1→0 01,10
    如果选择的非此种序列,那么至少存在连续两个元素相同,那么顺时针移动一次必然不能使得移动前后所有元素都发生改变。如 1001 1001 1001移动后成 1100 1100 1100,第三个元素未变。选择成为 010101...01 010101...01 010101...01 101010...10 101010...10 101010...10就一定能保证只需移动一次就可以翻转所有元素。而其他情况移动成功情况至少要移动次数为max(max(连续的1个数),max(连续的0个数))。

  3. 开始选取元素:我们尽可能保证当前待选的元素放到序列后成为使得序列成为 0101...01 0101...01 0101...01或者 1010...10 1010...10 1010...10这两种,如果这两种不行,则就会出现某一个序列被加上当前待选元素后成为 0101...0 0101...0 0101...0或者 1010...1 1010...1 1010...1。由于尽可能少操作,即序列尽可能少,假设当前待选元素为 0 0 0,那么优先考虑加到 1010...1 1010...1 1010...1这种序列后面,如果这种序列不存在,那么考虑加到 0101...01 0101...01 0101...01这种序列后面,如果这种序列也不存在,那么考虑自己开辟一个新的序列,以 0 0 0开头,此时操作数加 1 1 1。待选元素为 1 1 1同理。

代码:

#include<bits/stdc++.h>
using namespace std;

const int N = 1000010;
char s[N];
char t[N];
int str[N];
int g;
int n;

int main()
{
	scanf("%d", &n);
	scanf("%s", s + 1);
	scanf("%s", t + 1);
	
	int cnts[2] = {0}, cntt[2] = {0};
	for(int i = 1; i <= n; i++) {
		cnts[s[i] - '0']++;
		cntt[t[i] - '0']++;;
		if(s[i] == t[i]) continue;
		str[++g] = i;
	} 
	
	
	if(cnts[0] != cntt[0] || cnts[1] != cntt[1]) puts("-1");
	else {
		//cnt[i][j]表示第一个是i的当前为j的 
		int cnt[2][2] = {0, 0, 0, 0}, res = 0;
		for(int i = 1; i <= g; i++) {
			if(s[str[i]] == '0') {
				if(cnt[1][1]) cnt[1][1]--, cnt[1][0]++;
				else if(cnt[0][1]) cnt[0][1]--, cnt[0][0]++;
				else cnt[0][0]++, res++;
			} 
			else {
				if(cnt[0][0]) cnt[0][0]--, cnt[0][1]++;
				else if(cnt[1][0]) cnt[1][0]--, cnt[1][1]++;
				else cnt[1][1]++, res++;
			}
		}	
		printf("%d\n", res);
	}
	return 0;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Codeforces 1370 E 的相关文章

随机推荐

  • cin读取数字时遇到字符的情况

    cin读取数字时遇到字符 当定义一个int变量 用cin输入时 如果输入的是一个字符 会发生以下4中情况 1 n的值变成0 2 不匹配的输入被留在输入流中 3 cin对象的一个错误标记被设置 即cin fail 返回true 4 对cin的
  • SpringBoot项目用 jQuery webcam plugin实现调用摄像头拍照并保存图片

    参考博客 http www voidcn com article p oigngyvb kv html 自定义样式
  • TestNG测试用例

    使用TestNG的第一个测试用例 要遵循的步骤 1 按Ctrl N 在TestNG类别下选择 TestNG Class 然后单击Next 要么 右键单击Test Case文件夹 转到TestNG并选择 TestNG Class 2 如果您的
  • 考研/面试 数据结构大题必会代码(理解+记忆,实现使用C++,STL库)

    文章目录 一 线性表 1 逆置顺序表所有元素 2 删除线性链表中数据域为 item 的所有结点 3 逆转线性链表 递归 快速解题 非递归 4 复制线性链表 递归 5 将两个按值有序排列的非空线性链表合并为一个按值有序的线性链表 二 树 1
  • 门面模式

    门面模式是对象的结构模式 外部与一个子系统的通信必须通过一个统一的门面对象进行 门面模式提供一个高层次的接口 使得子系统更易于使用 门面模式有三个角色组成 1 门面角色 facade 这是门面模式的核心 它被客户角色调用 因此它熟悉子系统的
  • DVWA靶场--文件上传/包含(low-high).

    文件上传 low 没有做任何过滤直接上传即可 medium 源码 uploaded type image jpeg uploaded type image png 这段源码可以看出来他对上传到content type值做了过滤 只允许上传这
  • 分享如何建立一个完美的 Python 项目

    当开始一个新的 Python 项目时 大家很容易一头扎进去就开始编码 其实花一点时间选择优秀的库 将为以后的开发节省大量时间 并带来更快乐的编码体验 在理想世界中 所有开发人员的关系是相互依赖和关联的 协作开发 代码要有完美的格式 没有低级
  • 小程序`canvasToTempFilePath:fail:cearte bitmap failed?`

    这个方法的思路来源链接 微信开放社区 主要是通过延迟 重试 以及画质来解决手机性能等问题导致的canvasToImageFile故障 代码仅供参考 欢迎大家提供更多方法或思路 或指出代码异常 谢谢 下面是我用到项目中的代码片段 海报信息 P
  • PID算法的理论分析

    PID算法的理论和应用 PID算法基本原理 PID算法的离散化 PID算法伪代码 PID算法C 实现 pid cpp pid h pid example cpp Python代码 仿真结果 PID算法基本原理 PID算法是控制行业最经典 最
  • webbench剖析

    webbench 其为linux上一款web性能压力测试工具 它最多可以模拟3万个并发连接数来测试服务器压力 其原理为fork多个子进程 每个子进程都循环做web访问测试 子进程将访问的结果通过管道告诉父进程 父进程做最终结果统计 其主要原
  • javaweb 之 JDBC 详解 数据库连接池

    JDBC简介 JDBC 就是使用Java语言操作关系型数据库的一套API 全称 Java DataBase Connectivity Java 数据库连接 JDBC 本质 官方 sun公司 定义的一套操作所有关系型数据库的规则 即接口 各个
  • 基于深度学习的花卉图像关键点检测

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 在本文中 我们描述了我们如何使用卷积神经网络 CNN 来估计花卉图像中关键点的位置 并且在 3D 模型上渲染这些图像上茎和花的位置等关键点 为了能够与真实花束的照片对比
  • C语言数码管全熄,各位大神,如何用C语言实现在数码管上实现1234同时亮

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 将移位寄存器内的数据锁存到输出寄存器并显示 void OUT 595 void RCK 595 0 nop nop
  • Linux下tar命令解压到指定的目录

    文章转自 http blog sina com cn s blog 62449fcf0100nfar html 版权归原作者 Linux下tar命令解压到指定的目录 tar zxvf bbs tar zip C zzz bbs 把根目录下的
  • POJ 2479 Dual Core CPU|网络流|dinic模版

    问题描述 总时间限制 15000ms 单个测试点时间限制 5000ms 内存限制 65536kB 描述 As more and more computers are equipped with dual core CPU SetagLilb
  • AI实战训练营&MMDetection安装配置指南

    AI实战训练营 MMDetection安装配置指南 一 MMDetection简介 版本迭代变化 2 0 3 0 二 环境检测和安装 三 准备数据集 四 自定义配置文件 一 MMDetection简介 MMDetection 是被广泛使用的
  • mq topic持久化订阅者(topic、queue的producer.setDeliveryMode(DeliveryMode. PERSISTENT)是指的mq服务),queue的消费者不在也会给

    mq topic持久化订阅者 topic queue的producer setDeliveryMode DeliveryMode PERSISTENT 是指的mq服务 queue的消费者不在也会给他保留 topic只有持久化订阅者会保留 1
  • 华为上机考试注意事项及编程技巧

    华为上机考试注意事项及编程技巧 这是一篇关于华为招聘软件类职位上机考试的博客 主要介绍一下华为机考的流程 注意事项以及一些机试题中常用的编程技巧 写得有点长 但都是尽心尽力敲的 如果真的要参加华为招聘 或者类似公司的招聘 建议稍微花点时间看
  • iOS navigationController中回到tabbarController根视图方法

    根据需求来改变跳转 self navigationController popToRootViewControllerAnimated NO self dismissViewControllerAnimated NO completion
  • Codeforces 1370 E

    题意 给定两个 01 01 01序列 S S S和 T T T 可以选择