题目链接

题目分析

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

因为异或 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. 云储存选择做Hexo博客图床(腾讯云、七牛云、网易云)

    前言 博客里需要添加很多图片作为内容的补充,但是把图片放在本地博客文件夹里,上传到网上后,加载这些图片就是一个很大的问题,他们会拖累网页加载的速度,所以建议把图片放图床里,通过外链来访问和加载这些图片 ...

  2. Java 中的值传递和引用传递 ?

    一. 介绍 值传递:值传递(Pass-by-Value)当我们向方法传递参数时,实际上是将该参数的值进行拷贝,并将拷贝后的值传递给方法内部.在方法内部对参数进行修改不会影响原始变量的值. 引用传递:引 ...

  3. shell: logging + readlog

    logging #!/bin/bash # a small tool for logging sommething # # 1. read your input # 2. save to logs f ...

  4. 层叠样式表(CSS)1

    一.css的简介 1.层叠样式表的含义 层叠样式表:css是不仅是表现HTML的语言.还是进行样式修饰的语言 层叠:是对一个元素多次设置同一个样式,层层叠加覆盖,如不同的样式对一html标签进行修饰, ...

  5. 2021-8-5 Microsoft文档学习笔记(C#)

    以下列表概述了类可以包含的成员类型. 常量:与类相关联的常量值 字段:与类关联的变量 方法:类可执行的操作 属性:与读取和写入类的已命名属性相关联的操作 索引器:与将类实例编入索引(像处理数组一样)相 ...

  6. Docker使用教程及常用命令

    Docker是一个开源的应用容器引擎,允许开发者将应用以及依赖打包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows上.它非常适用于持续集成与持续交付(CI/CD). 1. 安装 ...

  7. JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践

    前言 自 2014 年发布以来, JDK 8 一直都是相当热门的 JDK 版本.其原因就是对底层数据结构.JVM 性能以及开发体验做了重大升级,得到了开发人员的认可.但距离 JDK 8 发布已经过去了 ...

  8. [Love] VSCODE 调试 LOVE 引擎游戏

    VSCODE调试LOVE引擎游戏 安装插件 配置插件 按 CTRL + SHIFT + P,打开Preferences: Open User Settings (JSON),为settings.jso ...

  9. ETL之apache hop系列1-ETL概念与hop简介

    ETL 简单介绍 ETL概念 ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的 ...

  10. 三维模型OBJ格式轻量化压缩变形现象分析

    三维模型OBJ格式轻量化压缩变形现象分析 三维模型的OBJ格式轻量化压缩是一种常见的处理方法,它可以减小模型文件的体积,提高加载和渲染效率.然而,在进行轻量化压缩过程中,有时会出现模型变形的现象,即压 ...