首页 > 代码库 > UVa11988 Broken Keyboard (a.k.a. Beiju Text) (链表)

UVa11988 Broken Keyboard (a.k.a. Beiju Text) (链表)

链接:http://acm.hust.edu.cn/vjudge/problem/18693
分析:链表。用nxt[i]保存s[i]右边字符在s中的下标。增加一个虚拟字符s[0],那么nxt[0]就是显示屏中最左边的字符。cur表示光标位置左边的字符在s数组中的下标,last表示显示屏中最后一个字符在s数组中的下标。其实就是用nxt链表重新组织s数组的输出顺序,输入一个字符,先将新插入字符的nxt[i]指向nxt[cur],再将nxt[cur]指向i,就是在链表元素cur后插入元素i,更新最后一个字符的编号也就是链表中最后一个元素,移动光标位置,移动到新插入元素(插入字符在s中的下标)结点的位置。‘[‘移动到最左边cur=0,‘]‘移动到最后。

 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4  5 const int maxn = 100000 + 5; 6  7 int cur, last, nxt[maxn]; 8 char s[maxn]; 9 10 int main() {11     while (scanf("%s", s + 1) == 1) {12         int n = strlen(s + 1);13         last = cur = 0;14         nxt[0] = 0;15         for (int i = 1; i <= n; i++) {16             if (s[i] == [) cur = 0;17             else if (s[i] == ]) cur = last;18             else {19                 nxt[i] = nxt[cur];20                 nxt[cur] = i;21                 if (cur == last) last = i;22                 cur = i;23             }24         }25         for (int i = nxt[0]; i; i = nxt[i])26             printf("%c", s[i]);27         printf("\n");28     }29     return 0;30 }

 

UVa11988 Broken Keyboard (a.k.a. Beiju Text) (链表)