COJ 0017 20604悲剧文本

传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=17

20604悲剧文本
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

    你有一个键盘,键盘上所有的键都能正常使用,只是Home键和End键有时会自动按下。你并不知道这一情况,而是专心地打稿子,甚至连显示器都没开电源。当你打开显示器之后,展现在你面前的是一段悲剧文本。你的任务是根据给出的键盘上实际输入的内容,计算并输出这段悲剧文本(即显示器上展现的文本)。

输入
一行文本不超过1000000个字符,只包括字母、下划线、字符'['(表示Home键)和字符']'(表示End键盘)。
输出
一个字符串,即符合题目描述的悲剧文本。
输入示例
This_is_a_[Beijing]_text
输出示例
BeijingThis_is_a__text
其他说明
如果你还不知道键盘上Home键和End键干什么用的,请你百度一下。

蒟蒻链表,但很容易写错的。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 const int maxn=1000000+10;
 8 int fch,end,now,next[maxn],ms=0,v[maxn];
 9 inline int read(){
10     int x=0,sig=1;char ch=getchar();
11     while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();}
12     while(isdigit(ch)) x=10*x+ch-'0',ch=getchar();
13     return x*=sig;
14 }
15 inline void write(int x){
16     if(x==0){putchar('0');return;} if(x<0) putchar('-'),x=-x;
17     int len=0,buf[15]; while(x) buf[len++]=x%10,x/=10;
18     for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return;
19 }
20 void init(){
21     return;
22 }
23 void work(){
24     fch=0;now=0;end=0;next[fch]=-1;
25     char ch=getchar();
26     while(1){
27         if(ch=='[') now=fch;
28         else if(ch==']') now=end;
29         else if(isalpha(ch)||ch=='_'){
30             next[++ms]=next[now];
31             next[now]=ms;
32             v[ms]=ch;
33             now=ms;
34             if(next[now]==-1) end=ms;
35         }
36         else break;
37         ch=getchar();
38     }
39     return;
40 }
41 void print(){
42     for(int i=next[fch];i!=-1;i=next[i]) putchar(v[i]);
43     return;
44 }
45 int main(){
46     init();work();print();return 0;
47 }