1 条题解
-
0
自动搬运
来自洛谷,原作者为

volatile
等下次能改名字了,而且橙名了,我就把名字给改掉,看你们还认不认得出我搬运于
2025-08-24 23:14:17,当前版本为作者最后更新于2025-05-13 13:42:07,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
思路
模拟方式
模拟罢了,但是如何实现光标?考虑使用两个栈 和 , 表示光标左侧的文字, 表示光标右侧的文字(如下图)。

操作判断
这里反而是最简单的。
光标移动的判断
判断读入的字符串第一位是不是数字即可,至于往左和往右看最后一位。
获取 的方式很简单,从第一位遍历到倒数第二位(最后一位是方向)用一个初始为 的变量 ,每次乘以 在加上当前字符,就能实现增加位数。
int t=0; for(int i=0;i<s.size()-1;i++) t=t*10+(s[i]-'0');在移动过程中,每移动一位就要将对应方向的栈顶字符插入到另一个栈中(如下图)。

if(s[s.size()-1]=='h'){ while(t--&&!a.empty()){ b.push(a.top()); a.pop(); } } else{ while(t--&&!b.empty()){ a.push(b.top()); b.pop(); } }删除字符的判断
看第一位和最后一位,大同小异,只是获取 要从第二位开始。删除字符的方式也很简单,根据方向把对应的栈的栈顶弹出即可。
if(s[s.size()-1]=='h') while(t--&&!a.empty()) a.pop(); else while(t--&&!b.empty()) b.pop();插入字符串
由于插入字符串是统一在光标左侧,所以只需要插入在 栈即可。
for(int i=8;i<s.size()-1;i++) a.push(s[i]);输出
现将 栈的所有字符转移到 栈,最后遍历 栈即可。
代码
#include<iostream> #include<stack> using namespace std; stack<char>a,b; int main() { int T; cin>>T; string s; getline(cin,s); while(T--){ getline(cin,s); if(s[0]>='0'&&s[0]<='9'){ int t=0; for(int i=0;i<s.size()-1;i++) t=t*10+(s[i]-'0'); if(s[s.size()-1]=='h'){ while(t--&&!a.empty()){ b.push(a.top()); a.pop(); } } else{ while(t--&&!b.empty()){ a.push(b.top()); b.pop(); } } } else if(s[0]=='d'){ int t=0; for(int i=1;i<s.size()-1;i++) t=t*10+(s[i]-'0'); if(s[s.size()-1]=='h') while(t--&&!a.empty()) a.pop(); else while(t--&&!b.empty()) b.pop(); } else{ for(int i=8;i<s.size()-1;i++) a.push(s[i]); } } while(!a.empty()){ b.push(a.top()); a.pop(); } while(!b.empty()){ cout<<b.top(); b.pop(); } return 0; }
- 1
信息
- ID
- 12136
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者