题目链接

题目分析

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

因为异或 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. CF1810D Candies题解

    CF1810D Candies 点击查看原题 点击查看思路 经典的小学数学奥数题. 设 \(a\) 为每天往上爬的高度,\(b\) 为每天向下降的高度,\(n\) 为给定的需要爬上去的天数. 请注意, ...

  2. 【原创】Ftrace使用及实现机制

    Ftrace使用及实现机制 版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正. 目录 Ftrace使用及实现机制 ...

  3. 快速切换 nodejs 的版本

    最近在开发一个常驻进程.定时任务统一调度系统,以应对开发在进程管理方面遇到的各种复杂问题. 组里开发项目,一般来说是一个人承包整个项目,包括调度器设计,还有后台系统.我还有一部分工作,是队列相关的信息 ...

  4. FreeBSD 内核模块和硬盘相关

    查看已加载的内核模块 使用命令:kldstat 加载驱动: kldload xx 查看识别到的硬盘 使用命令:dmesg | grep sector freeBSD 查看硬件信息 使用命令:dmesg ...

  5. PostgreSql: 安装与链接

    环境介绍 使用宝塔面板,在阿里云中安装PostgreSql,并使用DataGrip在本地进行链接 postgresql 配置 安装postgresql 在宝塔中安装postgresql 管理器 在此处 ...

  6. 解决: better-scroll.esm.js?f40f:180 [BScroll warn]: EventEmitter has used unknown event type: "pullingUp"

    改为这样,把所有值设为true mounted() { // 滚动条 this.scroll = new BScroll(this.$refs.wrapper, { click: true, obse ...

  7. pandas取出包含某个值的所有行

    pandas取出包含某个值的所有行df = df[df["from_account"].str.contains("fcwhx")] pandas取出不包含某个 ...

  8. 开源元数据管理平台Datahub最新版本0.10.5——安装部署手册(附离线安装包)

    大家好,我是独孤风. 开源元数据管理平台Datahub近期得到了飞速的发展.已经更新到了0.10.5的版本,来咨询我的小伙伴也越来越多,特别是安装过程有很多问题.本文经过和群里大伙伴的共同讨论,总结出 ...

  9. 2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar

    2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar ...

  10. 部署基于etcd的coredns集群

    前言 现需要为公司搭建私有DNS,私有服务器都使用私有DNS的地址,便于访问内部自定义的域名.采用CoreDNS + ETCD方案部署,coredns和etcd都以三实例运行,etcd为集群模式,使用 ...