题目链接

题目分析

首先,看到题目中的左移右移之后再异或,我们自然可以想到在移动的过程中字符串的一段前缀和后缀不会改变,考虑通过这个性质逐位还原。

因为异或 0 不会改变原本的值,所以我们可以找到整个字符串的第一个 1,把这个位置即为 \(i\),用它右移异或其他与另一字符串不同值的位置,因为我们每次异或的副作用只作用在那一位之后,所以经过这个操作可以保证第 \(i+1\) 到第 \(n\) 位被全部还原。

那前面部分的不同值呢,将其拉到前面异或会导致其他因素改变,如果拉最后一个则有可能只有这一个 1 而自己也需要改变,注意到如果小于 \(i\) 的所有位置都为 0 就好操作的多,只需复制前面的操作,改变一下方向把这个 1 往前推即可,那么我们如何将所有情况转化为这种情况呢?

其实很简单,记一开始的两个字符串第一个 1 的位置分别为 \(j\) 和 \(k\),\(j\leq k\) 则无需操作,否则把一个后面的 1 拉过来与这位异或一下即可,可以发现情况一最多操作 \(n\) 次,情况二最多 \(n-k+1\) 次。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define ll long long
using namespace std;
bool jud(int n,string s){
for(int i=0;i<n;i++) if(s[i]!='0') return false;
return true;
}
int find(int n,string s){
for(int i=0;i<n;i++) if(s[i]=='1') return i;
}
char change(char x){
return x=='0'?'1':'0';
}
string ope(int n,string s,int k){
string tmp=s;
for(int i=0;i<n;i++){
int ti=i+k;
if(ti<0 || ti>=n) continue;
if(tmp[ti]=='1') s[i]=change(s[i]);
}
return s;
}
int opt[1000001],tot=0;
int main(){
int t;
cin>>t;
while(t--){
int n;tot=0;
string a,b;
cin>>n>>a>>b;
if((jud(n,a) && !jud(n,b))||(!jud(n,a) && jud(n,b))){
cout<<-1<<endl;
continue;
}
if(a==b){cout<<0<<endl;continue;}
int j=find(n,a),k=find(n,b);
if(j>k) {opt[++tot]=j-k;a=ope(n,a,j-k);j=k;}
for(int i=j+1;i<n;i++) if(a[i]!=b[i]){opt[++tot]=j-i;a=ope(n,a,j-i);}
int pl=0;
for(int i=n;i>0;i--) if(a[i]=='1') {pl=i;break;}
for(int i=j;i>=0;i--)if(a[i]!=b[i]){opt[++tot]=pl-i;a=ope(n,a,pl-i);}
cout<<tot<<endl;
for(int i=1;i<=tot;i++) cout<<opt[i]<<' ';
cout<<endl;
}
}

CF1789D Serval and Shift-Shift-Shift 题解的更多相关文章

  1. Triple Shift

    来源:Atcoder ARC 136 B - Triple Shift (atcoder.jp) 题解:这道题我们不可能去硬模拟(大多数这种题都不能这样去模拟的),然后我们就要去发现特性, 发现把 a ...

  2. Javascript——arguments的shift问题谈方法“借用”

    今天本来运行了打算这样的方法 arguments.shift() (shift方法是删除数组的第一个元素,例如var arr=[1,2,3,4,5]执行var a=arr.shift();之后,a的值 ...

  3. 小tip:关于typeof,instanceof,toString(),valueOf(),toLocaleString(),join(),reverse(),sort(),pop(),push(),shift(),unshift()

    typeof:用于检测一个变量是否是基本数据类型.instanceof用于检测某引用对象是什么类型的对象. var s = "Nicho"; var b = true; var n ...

  4. (转)Eclipse快捷键大全,导包快捷键:ctrl+Shift+/

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...

  5. shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、功能、select

    1.expr计算整数变量值 s=`expr 2 + 3` 运算符号和參数之间要有空格分开: 2.let命令 let s=(2+3)*4 echo $s 3.for语句 for 变量 in 列表 do ...

  6. C#-判断Shift,Alt,Ctrl是否被按下,确定所按下的组合键

    在创建接受用户击键的应用程序时,您还可能希望监视 SHIFT.ALT 和 CTRL 键等组合键.当一个组合键与其他键同时按下,或在单击鼠标的同时按下时,您的应用程序能够做出适当响应:字母 S 可能仅导 ...

  7. Eclipse快捷键大全,导包快捷键:ctrl+Shift+/【转】

    Ctrl+Shift+L 显示所有快捷键 Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复 ...

  8. 《Advanced Bash-scripting Guide》学习(十一):shift的用法

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 Example 4-7 使用shift #!/bin/bash #使用shift ...

  9. js开发:数组的push()、pop()、shift()和unshift()(转)

    js开发:数组的push().pop().shift()和unshift() 2017-05-18 11:49 1534人阅读 评论(0) 收藏 举报  分类: javascript开发(22)  版 ...

  10. 处理回车提交、ctrl+enter和shift+enter都不提交->textarea正常换行

    <input type="textarea" @on-keypress="handlerMultiEnter"> handlerMultiEnter ...

随机推荐

  1. 2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?

    2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同? 答案2023-07-14: 在Kafka中,文件的布局采用了Topic/Partition的方式,每个分区对应一个物理文件夹 ...

  2. 加速LakeHouse ACID Upsert的新写时复制方案

    概述 随着存储表格式 Apache Hudi.Apache Iceberg 和 Delta Lake 的发展,越来越多的公司正在这些格式的基础上构建其 Lakehouse,以用于许多用例,例如增量摄取 ...

  3. 基准测试工具 --- BenchmarkDotNet

    介绍 今天介绍一个非常强大的基于.Net 的基准测试工具BenchmarkDotNet. BenchmarkDotNet 已经被14300多个项目采用,包括非常多的知名开源项目,例如 dotnet/p ...

  4. 【技术积累】Vue.js中的组件库【一】

    Vue组件库是什么 Vue中的组件库是一组预先构建好的可重用组件,用于加速开发过程并提高代码的可维护性.组件库通常包含一系列常用的UI组件,如按钮.输入框.下拉菜单等,以及一些功能性组件,如模态框.轮 ...

  5. React:TypeError: Cannot read properties of undefined (reading 'map')

    解决方案 js中?问号代表可选项 可选链式操作符 参考链接 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Oper ...

  6. PHPstudy+Xdebug动态调试代码过程中遇到一分钟就超时问题的解决办法

    环境是PhpStorm+Xdebug+WAMP 在实际调试的过程中 碰到了调试还没走完就自动结束的情况 很尴尬 查阅了相关文档资料 找到了解决方法 首先在php.ini中进行修改 我的配置文件地址在 ...

  7. 搭建rsyncd服务

    前言 rsync常用来做文件传输和同步.本文示例中客户端通过rsync同步服务端的/home/tmp目录到本地(不是将客户端的文件同步到服务端). 环境信息 IP 系统版本 rsync版本 说明 19 ...

  8. 更专业省心的来了,你没必要研究UE4和Unity官方推流了!

    在当今互联网时代,所有的内容制作者都希望尽可能触达到更多的目标受众,那就需要全平台发布内容并且可以轻松跨平台分享,包括手机.平板电脑.个人电脑以及交互式屏幕,用户能畅快的获得高质量的体验.需求催生了一 ...

  9. 历时数月钻研推流/对比各种流媒体服务程序/PK总结

    1 前言 大量测试下来,网页显示视频流实时性从高到低依次是 webrtc > ws-flv > flv > hls.播放器打开rtsp/rtmp视频流实时性由具体的播放器控制,比如缓 ...

  10. 音视频FAQ(一):视频直播卡顿

    一.摘要 本文介绍了视频直播卡顿的四个主要原因,用户网络问题.用户设备性能问题.技术路线的选择和实现问题.因本文主要阐述视频直播的卡顿,故技术路线的实现指的是:CDN供应商的实现问题,包含CDN性能不 ...