正题

题目链接:https://atcoder.jp/contests/arc132/tasks/arc132_d


题目大意

给出两个恰好有nnn个111和mmm个000的字符串s,ts,ts,t,定义两个字符串距离为通过交换两个相邻的字符把一个变成另一个的最小步数。

对于字符串kkk如果dis(s,k)+dis(k,t)=dis(s,t)dis(s,k)+dis(k,t)=dis(s,t)dis(s,k)+dis(k,t)=dis(s,t)那么kkk在s,ts,ts,t之间。

定义一个字符串的权值为相邻的相同字符对数。

求所有在s,ts,ts,t之间的字符串中权值最大是多少。

1≤n+m≤3×1051\leq n+m\leq 3\times 10^51≤n+m≤3×105


解题思路

先考虑在s,ts,ts,t之间的字符串有什么性质,显然的我们对于求dis(s,t)dis(s,t)dis(s,t)的时候最优的策略肯定是把sss的第iii个111移动到ttt的第iii个111处。

也就是对于两个串中第iii个111的位置记为x,yx,yx,y,那么就是一个一要从x→yx\rightarrow yx→y,也就是在s∼ts\sim ts∼t之间的字符串第iii个一肯定在x∼yx\sim yx∼y这个范围。

这样我们处理出每个111的合法区间li,ril_i,r_ili​,ri​,显然的lil_ili​和rir_iri​必定递增,因为交换两个111的顺序必定不划算。所以可以考虑贪心。

不考虑边界的问题,那么我们显然要让111的连续段尽量少,那么从小到大考虑l,rl,rl,r如果能和上一个放一起就放一起,不然就放在rrr的位置最赚。

然后考虑边界,右边界可以直接判断因为我们肯定是尽量往右放的。左边界的话我们如果l1=1l_1=1l1​=1我们就分两种情况考虑,也就是第一个放在左边界和第一个放在r1r_1r1​两种情况取个最大值。

时间复杂度:O(n+m)O(n+m)O(n+m)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=6e5+10;
int A,B,m,n,t[N],l[N],r[N],ans,prt;
char a[N],b[N];
//void Change(int x,int val){//  while(x<=m){//      t[x]+=val;
//      x+=lowbit(x);
//  }
//  return;
//}
//int Ask(int x){//  int ans=0;
//  while(x){//      ans+=t[x];
//      x-=lowbit(x);
//  }
//  return ans;
//}
int main()
{scanf("%d%d",&A,&B);m=A+B;scanf("%s",a+1);scanf("%s",b+1);for(int i=1;i<=m;i++)if(a[i]=='1')l[++n]=i;n=0;for(int i=1;i<=m;i++)if(b[i]=='1')r[++n]=i;for(int i=1;i<=n;i++){if(l[i]>r[i])swap(l[i],r[i]);}int last=-1;for(int i=1;i<=n;i++){if(l[i]<=last+1)last++;else ans++,last=r[i];}ans=ans*2;if(last!=m)ans++;prt=m-ans;if(l[1]==1){last=1;ans=1;for(int i=2;i<=n;i++){if(l[i]<=last+1)last++;else ans+=2,last=r[i];}if(last!=m)ans++;ans=m-ans;prt=max(prt,ans);}printf("%d\n",prt);return 0;
}

ARC132D-Between Two Binary Strings【贪心】相关推荐

  1. Binary Strings

    Binary Strings 题目描述: 这个题目讲述的是,给定两个字符串和,这两个字符串由0和1组成,给定了两个操作,第一个操作是可以将字符串的最后一个字符移到字符串的最前面,第二个操作是可以将连续 ...

  2. CF- Educational Codeforces Round 97 (Rated for Div. 2)-1437B. Reverse Binary Strings【思维/贪心】

    题目链接 题意:给定一个01数量相等的二进制字符串,每次操作可以旋转一段子串,问至少多少次操作可以使得所有相邻字符都不一样. 思路:对于某个"00"开头(结尾),"11& ...

  3. Educational Codeforces Round 12 C. Simple Strings 贪心

    C. Simple Strings 题目连接: http://www.codeforces.com/contest/665/problem/C Description zscoder loves si ...

  4. 北邮OJ 1010. 16校赛-Binary Strings

    时间限制 5000 ms 内存限制 65536 KB 题目描述 One day, the teacher asked Weishen to judge whether a binary string ...

  5. Java for LeetCode 067 Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  6. LeetCode Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  7. LeetCode - Add Binary

    题目: Given two binary strings, return their sum (also a binary string). For example, a = "11&quo ...

  8. [LeetCode] 67. Add Binary Java

    题目: Given two binary strings, return their sum (also a binary string). For example, a = "11&quo ...

  9. 67. Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

最新文章

  1. 在数据库创建表的时候,时间设置为什么类型,会随着每次提交的时间发生变化
  2. 不要在桌面保存长期修改的文件否则系统挂了时候面临文件丢失的问题,长期总结面试资料(公司 题目 地址 氛围 加班情况 薪资情况)毁于一旦
  3. grub resourceunknown filesystem异常处理
  4. ci框架 反向代理配置_《网站建设》Nginx配置反向代理
  5. java响应鼠标滚轮事件_一文读懂鼠标滚轮事件(wheelEvent)
  6. java 文件写_java写入文件的几种方法分享
  7. JSF简单Ajax示例
  8. golang go语言_在7小时内学习快速简单的Go编程语言(Golang)
  9. ASP.NET中Cookie编程的基础知识
  10. 洞察SaaS:中国SaaS的前世今生
  11. 华硕无双新品首爆:H45标压处理器+全球首款2.8K 120Hz OLED屏
  12. python自加1_使用Python如何让里面的某个参数每调用一次程序就自加1
  13. 表视图(UITableView)与表视图控制器(UITableViewController)
  14. php嵌入html代码的三种方法
  15. ea 如何画bce备选架构图_GitHub - wongdean/rime-settings at 941ea079832ff211723bce1ce8e47344e527575e...
  16. 1.1介绍线程和运行(Introducing Thread and Runnable)
  17. 数据库系统 图书管理系统 C语言
  18. VSCODE无法代码跳转
  19. 关于ECMWF和ERA5没有近地面相对湿度数据的解决办法
  20. 微信小程序防止后退,返回主页,30秒看完关闭

热门文章

  1. python多进程间通信_python多进程间通信代码实例
  2. JAVA软件图片浏览下载_java模拟浏览器下载图片
  3. python怎么处理异常然后继续_Python异常处理-返回行,继续
  4. linux运维趋势 37期刊为啥没有,linux运维常见问题
  5. 在鹅厂,我作为一个Java 程序员每天都在摸鱼!!!
  6. 爱卡创誓记java刷钱_【178创誓记】快速升级:40到50级只需要两天的黄金刷
  7. ueditor如何设置上传图片的高度宽度_怎么设置天猫主图
  8. c语言随机数循环延迟,C语言生成随机数的函数、延时函数
  9. python中可以表示任意大的整数_Python无法表示99999999999999999999这样大的整数。
  10. mysql 精度_mysql-笔记 精度