description

洛谷P5513

solution

用一个二进制数维护这个节点所处的位置,那么"1"操作就是这个数\(*2\),"2"操作就是这个数\(*2+1\),"L"操作就是这个数\(-1\),"R"操作就是这个数\(+1\),但直接维护,每次"L""R"操作都暴力进位,就会被反复横跳(即不断地进行\("L""R"\))的数据卡掉,于是我们可以不进位,将\(+1、-1\)的标记记在目前的最后一位上,"U"操作时进位,操作结束后再从后往前扫一遍依次进位即可。确定了节点的位置,那么求出最短距离就很简单了。

code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char s1[N],s2[N];
int len1,len2,ch1[N],ch2[N],dep1,dep2;
int main(){
scanf("%s%s",s1+1,s2+1);
len1=strlen(s1+1);len2=strlen(s2+1);
for(int i=1;i<=len1;++i){
if(s1[i]=='1') ch1[++dep1]=0;
else if(s1[i]=='2') ch1[++dep1]=1;
else if(s1[i]=='L') --ch1[dep1];
else if(s1[i]=='R') ++ch1[dep1];
else if(s1[i]=='U'){
ch1[dep1-1]+=ch1[dep1]>>1;
--dep1;
}
}
for(int i=dep1;i>=1;--i){
ch1[i-1]+=ch1[i]>>1;
ch1[i]=abs(ch1[i])%2;
}
for(int i=1;i<=len2;++i){
if(s2[i]=='1') ch2[++dep2]=0;
else if(s2[i]=='2') ch2[++dep2]=1;
else if(s2[i]=='L') --ch2[dep2];
else if(s2[i]=='R') ++ch2[dep2];
else if(s2[i]=='0'){
ch2[dep2-1]+=ch2[dep2]>>1;
--dep2;
}
}
for(int i=dep2;i>=1;--i){
ch2[i-1]+=ch2[i]>>1;
ch2[i]=abs(ch2[i])%2;
}
int ans=0;
while(dep1>dep2) --dep1,++ans;
while(dep2>dep1) --dep2,++ans;
int ans1=dep1*2,p=dep1,ans2=0,pos;
for(int i=1;i<=dep1;++i){
if(ch1[i]==ch2[i]) ans1-=2;
else{
p=i;
if(ch1[i]<ch2[i]) pos=1;
else pos=2;
break;
}
}
for(int i=p;i<=dep1;++i){
ans2<<=1;if(ans2>=ans1+dep1-p+1) break;
if(ch1[i]<ch2[i]){
if(pos==1) ++ans2;
else --ans2;
if(ans2>=ans1+dep1-p+1) break;
}
if(ch1[i]>ch2[i]){
if(pos==1) --ans2;
else ++ans2;
if(ans2>=ans1+dep1-p+1) break;
}
ans1=min(ans1,ans2+(dep1-i)*2);
}
printf("%d\n",ans+min(ans1,ans2));
return 0;
}

最新文章

  1. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制
  2. codePrinter
  3. ADB pm 命令
  4. 【leetcode】Binary Tree Level Order Traversal I &amp; II
  5. 【简单易懂的AMV图文教程-2】VEGAS基础进阶——认识关键帧
  6. [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01
  7. Dynamic LINQ OrderBy
  8. U盘安装CentOS7的最终解决方案
  9. Form_Form Builder本地部署运行的实现(案例)
  10. Android开发UI之ListView中的Button点击设置
  11. 利用数据库链做DML操作时报ORA-02069: global_names parameter must be set to TRUE for this operation
  12. mysql - 启动错误InnoDB: mmap(137363456 bytes) failed; errno 12
  13. Android(java)学习笔记239:多媒体之撕衣服的案例
  14. poj2342 Anniversary party【树形dp】
  15. Linux学习之CentOS(十四)----磁盘管理之 硬连接与软件连接(转)
  16. 映射内网ftp服务器到公网报错问题解决
  17. win7系统下dos界面无法自由调整大小
  18. vmware 开启VM的硬件cpu虚拟化功能
  19. 原生JS给元素添加class属性
  20. QT学习之第一个程序

热门文章

  1. 逆向so文件调试工具ida基础知识点
  2. tomcat 启动失败
  3. BMP位图调色板说明
  4. Sublime Text:性感无比的代码编辑器安装破解配置教程
  5. java 文件和byte 互转
  6. 【源码】spring生命周期
  7. Java才是世界上最好的语言,Java在高频交易中替代C++
  8. C语言I博客作业3
  9. 性能问题eg
  10. linux 内存泄露 valgrind