码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-09-01 07:02:34      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

链接: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) (链表)

标签:

原文地址:http://www.cnblogs.com/XieWeida/p/5828164.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!