UVA 11988 Broken Keyboard (a.k.a. Beiju Text)

来源:互联网 发布:阿里云 apk 编辑:程序博客网 时间:2024/06/07 13:13

看到有人说可以用双端队列!然后就写了,感觉比书上的链表更容易理解啊!

#include <iostream>#include <queue>#include <string>#include <cstdio>#include <cstring>using namespace std;int main(){char ch[1000005];while(scanf("%s",ch)!=EOF){deque<int> que;        int lenth=strlen(ch);        (ch[0]=='['||ch[0]==']')?que.push_front(1):que.push_front(0);//看第一个字符是什么        for(int i=1;i<lenth;++i)        {        if(ch[i]=='[')//把遇到的'['这个字符的位置放进队列!然后赋值为'\0'        {        que.push_front(i+1);        ch[i]='\0';        }        else if(ch[i]==']')        {        que.push_back(i+1);        ch[i]='\0';        }        }      //  cout<<que.size()<<endl;        while(!que.empty())        {        printf("%s",ch+que.front());        que.pop_front();        }        puts("");}return 0;}

书上的代码~

#include<cstdio>#include<cstring>const int maxn = 100000 + 5;int last, cur, next[maxn]; // 光标位于cur号字符之后面char s[maxn];int main() {  while(scanf("%s", s+1) == 1) {    int n = strlen(s+1); // 输入保存在s[1], s[2]...中    last = cur = 0;    next[0] = 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;}


0 0