Uva11988 Broken Keyboard (a.k.a. Beiju Text) 题解【模拟链表】

mac2022-06-30  23

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) {//输入字符从s[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; }
最新回复(0)