UVa-11988 悲剧文本

来源:互联网 发布:疯瞳世界淘宝 编辑:程序博客网 时间:2024/04/30 22:34


分析:这个题的题意还是很好理解的,就是如果'['便返回开头,']'便到尾部之后再继续输出。惯性思维,这个题用
数组存储,之后移动数组元素,这样做的效率是非常低的,数据太大会超时。如果想插入元素的速度快,链表,插入
是O(1)(想到这里,我就中陷阱了,错误的以为,vector等同于链表,其实不尽然,vector仍然是一块连续的空间
,插入的效率和C语言里的数组类似,所以,我便跪了数次,~~~~悲伤~~~~)。用链表也有好几种方式,可以用数组模
拟一个链表,也可以用结构体定义节点,最贱的还数STL里的list。


数组模拟的代码:


#include <cstdio>
#include <cstring>
const int maxn=100005;
int wei,head,next[maxn];
char s[maxn];
int main()
{
    while(scanf("%s",s+1)!=EOF)
    {
        int n=strlen(s+1);
        head=wei=0;
        next[0]=0;

        for (int i=1;i<=n;i++)
        {
            char ch=s[i];
            if (ch=='[') head=0;
            else if (ch==']') head=wei;
            else
            {
                next[i]=next[head];
                next[head]=i;
                if (head==wei) wei=i;
                head=i;
            }
        }
        for (int i=next[0];i!=0;i=next[i])
            printf("%c",s[i]);
        printf("\n");
    }
    return 0;
}



用STL写的代码:



#include <cstdio>
#include <cstring>
#include <list>
#include <iostream>
using namespace std;
int main()
{
    char str[100005];
    list <char> s;
    while (scanf("%s",str)!=EOF)
    {
        list <char>::iterator it=s.begin();
        int n=strlen(str);
        for (int i=0;i<n;i++)
        {
            char ch=str[i];
            if (ch=='[') it=s.begin();
            else if(ch==']') it=s.end();
            else
            {
                it=s.insert(it,ch);
                it++;
            }
        }
        for (it=s.begin();it!=s.end();it++)
            printf("%c",*it);
        s.clear();
        printf("\n");
    }
    return 0;
}
0 0
原创粉丝点击