题目概述
你键盘的home键和end键会不定时自动按下而你并不知道,你专心打字甚至连显示器都没开,只有打完一行你才去看一眼,给出你要打的文字和home,end键自动按下的时机,求最后打出来的字
时限
1000ms/2000ms
输入
每行一个字符串,字符串中的[代表home键被按下,]代表end键被按下,输入到EOF为止
限制
1<=字符串长度<=100000;字符串中仅含字母,_,[]
输出
每行一个字符串,为最后打出来的结果
样例输入
This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University
样例输出
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University
讨论
模拟,无非是考对stl的熟练度,频繁插入,首选list,没什么需要解释的
题解状态
0 KB,190 ms,C++11 4.8.2,674
题解代码
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<list>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 32
#define memset0(a) memset(a,0,sizeof(a))
list<char>type;//存储字符的链表
list<char>::iterator it;//控制插入位置的迭代器 俗称光标
void fun()
{
char c;
it = type.end();//初始时在末尾插入
while (~scanf("%c", &c) && c != '\n') {//input//每行以换行结尾
if (c == '[')
it = type.begin();//遇到home键就将光标移到开头
else if (c == ']')
it = type.end();//遇到end移到最后
else
type.insert(it, c);//插入后光标会自动移到插入字符的后面
}
it = type.begin();
while (it != type.end())
printf("%c", *it++);//output
printf("\n");//output
}
int main(void)
{
//freopen("vs_cin.txt", "r", stdin);
//freopen("vs_cout.txt", "w", stdout);
char c;
while (~scanf("%c", &c)) {//input//检查是否还有下一行输入
ungetc(c, stdin);//然后把吞进来的字符退回输入流
fun();
type.clear();//最后需要清空链表
}
}
EOF