题解:CF1381A1 Prefix Flip (Easy Version)

1|0思路

这道题直接用下一题的代码就行了

C1

注意到限制 3n 很大,于是看每一位是不是一样的,再操作,如样例一:

转化第一位:0111

转化第二位:110010

每次把当前位子提到第一位,然后翻转第一位,最后翻转回去,最多 3n 次,不用暴力操作直接计答案时间复杂度 O(n)

C2

注意到限制 2n 缩小了,考虑将每一位转化为相同的 0/1,如样例二:

转化第一个字符串:01011110110001111111

转化第二个字符串:1110000000

这个可以从前面开始遍历,如果这个位置与后一个位置不同,那么就对这一个位置之前的进行操作,这样可以保证在处理这个位置时前面的位置上的数全部相同在转化第二个字符串时因为一、二、四位都在转化时满足要求,所以跳过了这几个步骤。

把两个字符串都进行上面的操作,会的到两个全是 0/1 的字符串,如果不相同的话再整体翻转一次就行了,最多 n1+n1+1 次,即 2n1 次操作满足要求。

2|0Code

就只放 C2 的代码了

#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n; char a[N],b[N]; int ans1[N],ans2[N]; int main() { ios::sync_with_stdio(0); int T; cin>>T; while(T--) { cin>>n>>(a+1)>>(b+1); int res1 = 0,res2 = 0; for(int i = 1; i < n; ++i) { if(a[i] != a[i+1]) ans1[++res1] = i; if(b[i] != b[i+1]) ans2[++res2] = i; } if(a[n] != b[n]) ans1[++res1] = n; cout<<res1 + res2<<"\n"; for(int i = 1; i <= j; ++i) cout<<ans1[i]<<" "; for(int i = k; i > 0; --i) cout<<ans2[i]<<" "; cout<<"\n"; } return 0; }


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

__EOF__

本文作者虽不能至,心向往之
本文链接https://www.cnblogs.com/FChang/p/18310808.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FChang  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
xxx2755天7小时49分1秒
点击右上角即可分享
微信分享提示