1 条题解

  • 0
    @ 2025-8-24 23:14:17

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar volatile
    等下次能改名字了,而且橙名了,我就把名字给改掉,看你们还认不认得出我

    搬运于2025-08-24 23:14:17,当前版本为作者最后更新于2025-05-13 13:42:07,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路

    模拟方式

    模拟罢了,但是如何实现光标?考虑使用两个栈 aabbaa 表示光标左侧的文字,bb 表示光标右侧的文字(如下图)。

    操作判断

    这里反而是最简单的。

    光标移动的判断

    判断读入的字符串第一位是不是数字即可,至于往左和往右看最后一位。

    获取 nn 的方式很简单,从第一位遍历到倒数第二位(最后一位是方向)用一个初始为 00 的变量 tt,每次乘以 1010 在加上当前字符,就能实现增加位数。

    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();
        }
    }
    

    删除字符的判断

    看第一位和最后一位,大同小异,只是获取 nn 要从第二位开始。删除字符的方式也很简单,根据方向把对应的栈的栈顶弹出即可。

    if(s[s.size()-1]=='h') while(t--&&!a.empty()) a.pop();
    else while(t--&&!b.empty()) b.pop();
    

    插入字符串

    由于插入字符串是统一在光标左侧,所以只需要插入在 aa 栈即可。

    for(int i=8;i<s.size()-1;i++) a.push(s[i]);
    

    输出

    现将 aa 栈的所有字符转移到 bb 栈,最后遍历 bb 栈即可。

    代码

    #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

    [蓝桥杯 2024 国 Python A/Java A] 记事本

    信息

    ID
    12136
    时间
    3000ms
    内存
    512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者