uva 11988
[
跳到行首输入,]
跳到行尾输入,无非就是模拟链表插入。- 但是不必使用或模拟链表数据结构,只应用思想,提高效率,认清本质
- 要做的其实只需改变读取源输入的顺序
s
是源输入,下标从1开始,nxt
是存储读取顺序的表,下标从0开始- 读取顺序是,从
nxt[0]
获得第一个下标i
, 而nxt[i]
表示第i处的下一个索引,因此不断循环,直到nxt[i_last]
是0 - 所以初始化
nxt[0] = 0
,表示还没有数据,curr = last = 0
,curr
表示现在光标所在,接下来在curr后边插入,last
表示最后一个节点 - 在维护过程中
- 如果是数据,则需要将i这个索引插入,类似链表的插入思想,需要把这个i插入到curr后边,那就需要
nxt[i] = nxt[curr], nxt[curr] = i;
,再更新curr为i,在curr == last
的情况下,说明是句尾操作,所以更新last = curr
- 如果是
[
,要到句首插入,那就定位curr到0 - 如果是
]
,定位curr到last
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
#define maxn 10000 + 5
char s[maxn];
int nxt[maxn];
int main()
{
while (scanf("%s", s + 1) == 1)
{
int len = strlen(s + 1);
int curr, last;
curr = last = 0;
nxt[0] = 0;
for (int i = 1; i <= len; ++i)
{
char c = s[i];
if (c == '[')
curr = 0;
else if (c == ']')
curr = last;
else
{
nxt[i] = nxt[curr];
nxt[curr] = i;
if (curr == last)
last = i;
curr = i;
}
}
for (int i = nxt[0]; i; i = nxt[i])
cout << s[i];
cout << '\n';
}
return 0;
}