C++链表练习:破损的键盘Damaged keyboard(又名:悲剧的文本A tragic text)

时空限制

CPU占用时长: 1秒 内存使用限制: 128MB

问题描述

小明没有开屏幕就输入一个字符串,他的电脑键盘出现了问题会不定时的自动录入 “home”“end” 两个键,我们知道如果录入home则将光标定位到行首,如果录入end则是将光标定位到行末。
现在告诉你小明输入的字符串以及自动出现的“home”、“end”键,让你输出最后屏幕上显示的文本。

输入格式

输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“[”或 者“]”。
其中字符“[”表示Home键,“]”表示End键。输入文件不超过5MB。

输出格式

若干行,每行对应输入的一行文本

输入输出样例

样例1

输入样例

This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University

输出样例

BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

参考代码

#include <bits/stdc++.h>
 
using namespace std;
 
const int N = 1e5 + 5;
 
struct node {
    char val;
    int pre, nxt;
} a[N];
 
int tot, head, tail;
 
void init() {
    tot = 2;
    head = 1; tail = 2;
    a[head].nxt = 2;
    a[tail].pre = 1;
}
 
int insert(int p, char val) {
    int q = ++tot;
    a[q].val = val;
    a[q].pre = p;
    a[q].nxt = a[p].nxt;
    a[p].nxt = q;
    a[a[q].nxt].pre = q;
    return q;
}
 
int main() {
    string s;
    while (cin >> s) {
        init();
        int p = head;
        for (int i = 0; i < (int) s.size(); i++) {
            if (s[i] == '[') p = head;
            else if (s[i] == ']') p = a[tail].pre;
            else p = insert(p, s[i]);
        }
        p = a[head].nxt;
        while (p != tail) {
            cout << a[p].val;
            p = a[p].nxt;
        }
        cout << endl;
    }
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李老师信息奥赛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值