H - Balanced Reversals

  1. 首先可以将相邻的两个点分到一个组中

  2. 特判无解的情况:00的数量不相等或11的数量不相等

  3. 10的数量相等(此时01的数量也相等,因为知道10的数量后01的数量就确定了,\(cnt_{01}=\frac{n}{2}-cnt_{00}-cnt{11}-cnt{10}\)),可以发现这一规律:

11 00 10 01 \(\mathop{\Rightarrow}\limits^{4,6}\) 01 11 00 10,也就是说若想将某一组点放到队首并且此时除了这一组点的顺序是反的其他点的顺序照旧,只需进行两次操作,\(x-1,x+1\)(设\(x\)为当前这一组点的第一个的下标)

根据此规律,我们可以先构造出一个与所求序列刚好反过来的序列,最后再将构造出的这个序列翻一遍即可。为了节省次数,可以只处理前\(n-2\)个字符,因为保证所有所求序列中的点对在初始序列中都出现过,所以最后剩下这一点对一定就是所求序列末尾的点对(刚好对应上且顺序相同),于是最后的翻转就变成了翻转前\(n-2\)个字符

  1. 若不相等,就先变成相等的再解决

\(bel=cnt_{01}-cnt_{10}\)

若相等,一定有\(bel_a==bel_b\),若没有,设我们翻转\(a\)的前缀\(p\)可以使得\(bel_{a'}==bel_b\),则可以列出式子\(bel_{a'}=bel_a-2*bel_p=bel_b\ \ \ \ \Rightarrow\ \ \ \ bel_p=\frac{bel_a-bel_b}{2}\),可以通过分类\(cnt_{01}+cnt_{10}\)以及其对应的\(cnt_{01}\)与\(cnt_{10}\)的奇偶来讨论证明\(bel_a\)与\(bel_b\)的奇偶性相同

所以,枚举\(a\)的前缀求满足条件的前缀即可

但不一定是通过翻转\(a\)来使得相等,若翻转\(a\),需要\(|bel_a|\geqslant|bel_b|\),因为可以发现\(a\)的某一前缀的\(bel\)一定是其上一个前缀的\(bel\)值\(\pm1/0\)得到,也就是说从\(0\)到\(bel_a\)间的数(不包含0,包含\(bel_a\))一定是\(a\)的某一前缀的\(bel\),在这种情况下得到的\(bel_p\)一定是从\(0\)到\(bel_a\)间的某一个数(不包含0,包含\(bel_a\)),可以通过分类正负的方法证明

同理,若\(|bel_a|\leqslant|bel_b|\),则是翻转\(b\),此时\(bel_p=\frac{bel_b-bel_a}{2}\)

若翻转\(a\),则就是初始序列在一开始就先翻转;若翻转\(b\),则是初始序列所有的翻转已完成后再翻转

#include<bits/stdc++.h>
using namespace std;
const int N=4005;
int n,bal_a,bal_b,bal0,bal1,ans[N],cnt,flag;
string a,b;
void rever(string &a,int r){ for(int i=0;r-i>i;++i) swap(a[i],a[r-i]); }
void rs(string &a,int t){
int now=0;
for(int i=0;i<n;i+=2){
if(a[i]=='0'&&a[i+1]=='1') ++now;
if(a[i]=='1'&&a[i+1]=='0') --now;
if(now==t){
flag=i+2,rever(a,i+1);
break;
}
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
cin>>a,cin>>b,cnt=flag=bal_a=bal_b=bal0=bal1=0;
n=a.size();
for(int i=0;i<n;i+=2){
if(a[i]=='0'&&a[i+1]=='1') ++bal_a;
if(a[i]=='1'&&a[i+1]=='0') --bal_a;
if(a[i]=='0'&&a[i+1]=='0') ++bal0;
if(a[i]=='1'&&a[i+1]=='1') ++bal1;
if(b[i]=='0'&&b[i+1]=='1') ++bal_b;
if(b[i]=='1'&&b[i+1]=='0') --bal_b;
if(b[i]=='0'&&b[i+1]=='0') --bal0;
if(b[i]=='1'&&b[i+1]=='1') --bal1;
}
if(bal0||bal1){ printf("-1\n"); continue; }
if(bal_a-bal_b){
if(abs(bal_a)>=abs(bal_b)) rs(a,(bal_a-bal_b)/2),ans[++cnt]=flag,flag=0;
else rs(b,(bal_b-bal_a)/2);
}
for(int i=0;i<n-2;i+=2)
for(int j=i;j<n;j+=2)
if(b[i]==a[j]&&b[i+1]==a[j+1]){
(j)&&(ans[++cnt]=j),ans[++cnt]=j+2;
rever(a,j-1),rever(a,j+1);
break;
}
printf("%d\n",cnt+(n-2?1:0)+(flag?1:0));
for(int i=1;i<=cnt;++i) printf("%d ",ans[i]);
if(n-2) printf("%d ",n-2);
if(flag) printf("%d",flag);
printf("\n");
}
return 0;
}

CF1237H Balanced Reversals的更多相关文章

  1. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  2. CCI4.4/LintCode Balanced Binary Tree, Binary Tree, Binary Search Tree

    Binary Tree: 0到2个子节点; Binary Search Tree: 所有左边的子节点 < node自身 < 所有右边的子节点: 1. Full类型: 除最下面一层外, 每一 ...

  3. 110.Balanced Binary Tree Leetcode解题笔记

    110.Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, ...

  4. [Leetcode][JAVA] Minimum Depth of Binary Tree && Balanced Binary Tree && Maximum Depth of Binary Tree

    Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the n ...

  5. LeetCode - Balanced Binary Tree

    题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bin ...

  6. HDOJ 3709 Balanced Number

    数位DP... Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java ...

  7. [HDU3709]Balanced Number

    [HDU3709]Balanced Number 试题描述 A balanced number is a non-negative integer that can be balanced if a ...

  8. 【leetcode】Balanced Binary Tree(middle)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  9. [USACO07MAR]黄金阵容均衡Gold Balanced L…(洛谷 1360)

    题目描述 Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to na ...

  10. poj 3264:Balanced Lineup(线段树,经典题)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 32820   Accepted: 15447 ...

随机推荐

  1. 项目实战:在线报价采购系统(React +SpreadJS+Echarts)

    小伙伴们对采购系统肯定不陌生,小到出差路费.部门物资采购:大到生产计划.原料成本预估都会涉及到该系统. 管理人员可以通过采购系统减少管理成本,说是管理利器毫不过分,对于采购的效率提升也有极大帮助. 但 ...

  2. 乾象投资:基于JuiceFS 构建云上量化投研平台

    背景 乾象投资 Metabit Trading 成立于2018年,是一家以人工智能为核心的科技型量化投资公司.核心成员毕业于 Stanford.CMU.清北等高校.目前,管理规模已突破 30 亿元人民 ...

  3. CH58X服务修改

    在对ble系列应用时,很多时候拿手机充当主机.在使用ble 调试助手时常会用到write.read.notify等功能.有时可能会根据自己的需求对这些服务进行修改.下图是官方例程体现出的service ...

  4. mybatis-获取参数值的方式

    MyBatis获取参数值的两种方式(重点) MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串 ...

  5. .NET7 一个实用功能-中央包管理

    依赖管理是 NuGet 的核心功能.Nuget管理单个项目的依赖关系很容易.管理多项目解决方案的依赖关系可能会变得很困难,因为它们的规模和复杂性开始扩大. 在您管理许多不同项目的公共依赖项的情况下,您 ...

  6. day01-Tomcat框架分析

    引入课程和Maven 1.Maven maven中央仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com) maven仓库是国外的 ...

  7. SpringCloud——Eureka Feign Ribbon Hystrix Zuul等关键组件的学习与记录

    SpringCloud--Eureka Feign Ribbon Hystrix Zuul等关键组件的学习与记录 前言:本篇是对近日学习狂神SpringCloud教程之后的感想和总结,鉴于对Sprin ...

  8. Go语言核心36讲03

    [Go语言代码较多,建议配合文章收听音频.] 你好,我是郝林.从今天开始,我将和你一起梳理Go语言的整个知识体系. 在过去的几年里,我与广大爱好者一起见证了Go语言的崛起. 从Go 1.5版本的自举( ...

  9. 网络yum源下载

    思路一: 按照本地网罗源,然后使用reposync直接将源同步下载到本地 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/re ...

  10. c++学习笔记(入门)

    1 struct和class的区别 struct成员变量(成员函数)的访问属性缺省的情况下默认为public. class成员变量(成员函数)的访问属性缺省的情况下默认为private. 2 初始化列 ...