#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn =1e5 + 5;
int last, cur, Next[maxn];
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;
cur = i;
}
// printf("i = %d (s[%d] = %c): \n", i, i, s[i]);
// printf("cur = %d , last = %d\n", cur, last);
// for(int i = 0; i <= n; i ++)
// printf("Next[%d] = %d\n", i, Next[i]);
// cout << endl;
}
for(int i = Next[0]; i != 0; i = Next[i])
printf("%c", s[i]);
printf("\n");
}
return 0;
}
题意:
就是一个破损的键盘敲着敲着会不定时地自动按End(光标移至末尾)或者Home(光标移至开头)。输出最后的文本。[表示Home键。]表示End键。
题解:
还是没有弄明白如何用数组来弄链表,不过还是有点收获吧。注释的东西可以反映整个Next的变化过程,从中体会下。