CF1705D Mark and Lightbulbs 题解
题目大意
给定一个长度为 的 01 字符串 ,现在你可以选定一个 满足 ,然后把 变成 。现在你需要把 变成另一个给定的字符串 。求最小的操作数。
题目解析
我们考虑这个操作究竟能干什么。
我们可以发现,进行一次操作可以 使 01 分界线移动 ,不会改变 01 的段数。
所以如果 和 的 01 段数不同,或者 、 不同,就无解。
可以证明存在一种方案使得移动分界线的时候仅仅往同一方向移动,所以就不会有额外的操作出现。
所以就只需要扫一次得到 所有的 01 分界线,然后答案就是这些对应两个分界线的差的绝对值的和。
代码是非常简短的
int n; ll ans; char s1[maxn],s2[maxn]; int p1[maxn],p2[maxn],cnt1,cnt2; void work(){ n=read(); scanf("%s%s",s1+1,s2+1); if(s1[1]!=s2[1]||s1[n]!=s2[n]){ puts("-1"); return; } int i; cnt1=cnt2=0; ans=0; for(i=2;i<=n;i++) if(s1[i]!=s1[i-1]) p1[++cnt1]=i; for(i=2;i<=n;i++) if(s2[i]!=s2[i-1]) p2[++cnt2]=i; if(cnt1!=cnt2){ puts("-1"); return; } for(i=1;i<=cnt1;i++) ans+=mabs(p1[i]-p2[i]); print(ans),pc('\n'); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具