Uva11988 Broken Keyboard (a.k.a. Beiju Text) 题解【模拟链表】
题目:
思路:
1.next[i]表示真实屏幕中字符s[i]右边字符的编号(即在s中的下标),next[0]表示第一个字符的编号, s[next[0]]表示屏幕中应出现的第一个字符,next[最后一个]=0,用(i=next[0];i!=0;i=next[i]),输出应输出的字符s[i]。 2.光标cur表示要插入位置的左边那个,比如i=4时出现’[’,说明下一个字符(s[i=5])要插入到第1个位置,那么先将cur置为0,执行下一次i++,i=5;next[i=5]=next[cur=0];next[cur=0]=5; cur=5移动光标。 3.last表示显示屏中最后一个字符的编号,s[last]为最后一个字符。
不多废话了,上lrj代码,多看几遍代码也就明白了
代码:
#include <cstdio>
#include <cstring>
const int maxn
=100000+5;
int last
,cur
,next
[maxn
];
char s
[maxn
];
int main() {
while(scanf("%s",s
+1)==1) {
int n
=strlen(s
+1);
last
=cur
=0;
next
[0]=0;
memset(next
, 0, sizeof(next
));
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
;
}
}
for(int i
=next
[0];i
!=0;i
=next
[i
])
printf("%c",s
[i
]);
printf("\n");
}
return 0;
}