UVA11988

来源:互联网 发布:java 两list合并 编辑:程序博客网 时间:2024/06/05 22:52

Description

You’re typing a long text with a broken keyboard. Well it’s not so badly broken. The only problem
with the keyboard is that sometimes the “home” key or the “end” key gets automatically pressed
(internally).
You’re not aware of this issue, since you’re focusing on the text and did not even turn on the
monitor! After you finished typing, you can see a text on the screen (if you turn on the monitor).
In Chinese, we can call it Beiju. Your task is to find the Beiju text.

Input

There are several test cases. Each test case is a single line
containing at least one and at most 100,000 letters, underscores and
two special characters ‘[’ and ‘]’. ‘[’ means the “Home” key is
pressed internally, and ‘]’ means the “End” key is pressed internally.
The input is terminated by end-of-file (EOF).

Output

For each case, print the Beiju text on the screen.

Sample Input

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

Sample output

BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University

Explanation

数据范围大,直接用数组存下插入元素会移动大量元素
用数组模拟链表,为了方便,设置头节点(即在第一个节点前设置一个虚拟的节点)
然后按照要求模拟移动光标操作即可

Code

#include <stdio.h>#include <string.h>const int maxn = 100000 + 5;int last, cur, next[maxn];//cur为光标前的位置,next[i]表示下标为i的字符的下一个位置的下标char s[maxn];int main(){    while(~scanf("%s",s+1)){        int n = strlen(s+1);        last = cur = 0;        next[0] = 0;        for(int i = 1; i <= n; i++){            char ch = s[i];            if(ch == '[')                cur = 0;            else if(ch == ']')                cur = last;            else{                next[i] = next[cur];                next[cur] = i;                if(cur == last)                    last = i;//更新last                cur = i;//移动光标            }        }        for(int i = next[0]; i != 0; i = next[i])            printf("%c",s[i]);        printf("\n");    }    return 0;}