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

链表-破损的键盘 Uva 11988

时间:2018-10-17 00:24:18      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:ring   ret   color   clu   style   位置   char   printf   else   

#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;
        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;
 } 

for(int i=next[0];i!=0;i=next;)  用数组模拟链表 

cur代表当前字符的位置,也就是说它在光标的左边,i代表下一个字符  next[i]=next[cur];是把下一个字符的位置赋值为0,next[cur]=i;是把cur与i链接起来,cur->i; 在没有"["或者"]"出现的时候,last在cur的前面,也就是当前字符的前面,所以当 s[i]是"["是,last保存着它前一个字符的位置,当出现"]"时,last=cur又让cur回到了那个位置,然后cur又与i链接。

以这个输入为例。

ABC[DE]F

首先在ABC的时候,是按顺序链接的 0->1->2->3 当遇到‘[‘时,cur=0;所以 next[5]=next[0]; next[0]=5;这样  顺序就变成了 0->5->1->2->3; 然后到E这个字符,同样 next[6]=next[5];next[5]=6; 这样 顺序变成了 0->5->6->1->2->3; 然后到‘]‘ 这时候 cur=last=3; 然后到了F; next[9]=next[3]; next[3]=9; 这样 最后的顺序为 0->5->6->1->2->3->9;

链表-破损的键盘 Uva 11988

标签:ring   ret   color   clu   style   位置   char   printf   else   

原文地址:https://www.cnblogs.com/123123123gg/p/9800934.html

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