样例


Sample Input
This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University

Sample Output
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

/*
题意分析:将[]中的内容整体移动最左边
1.考虑用数组。显然不行,遇到[]中的内容需要大量移动元素。考虑极端情况
[]中的内容全部在最右边,所以需要一直移动。
2.于是此题的特点就是在数组中间大量的添加操作。于是想到了使用链表。
此处用静态链表。
3.其实静态链表就是模拟动态链表。
一般需要的变量:cur,last,nex[]

4.变量解释。cur表示动态链表的最后一个节点。节点空用0表示。
nex[cur]表示cur的下一个指针指向,cur表示当前节点下标(相当于动态链表的第i个节点,i=1.2.。。n)
nex[0]相当于头结点,只存第一个节点的指针。
last只是在本题中需要。代码中说明。
5.于是变量初始化。cur=0, nex[cur]=0.cur=0表示最开始没有节点
nex[cur]=0表示头结点指向null
6.于是插入节点有两种插法,假设插入i节点。i节点的指针指向为nex[i]
一是是尾节点进行插入i。本来是nex[cur] ---> 0
插入代码:nex[i] = nex[cur], nex[cur] = i;

二是,在头结点之后插入节点i,
插入代码:nex[i] = nex[cur], nex[cur] = i;
其实 代码是一样的。之后要让cur = i;指针后移。
其实会动态链表,这个很好理解。
代码如下:
*/


代码


#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
int nex[maxn];
int cur,last;//c 
char ch[maxn];

int main() {
    while(scanf("%s", ch+1)==1){
        int len = strlen(ch+1);
        cur = 0, last = 0, nex[0] = 0;
        for(int i=1; i<=len; i++){
            if(ch[i] == '[') cur = 0;
            else if(ch[i] == ']') cur = last;
            else{
                nex[i] = nex[cur];
                nex[cur] = i;
                if(cur == last) last = i;//last记录上一次结尾插入的位置
                cur = i;
            }
        }        

        for(int i=nex[0]; i!=0; i=nex[i])
            cout << ch[i];
        cout << endl;
    }   
    return 0;
}