破损的键盘(codevs 4650)

题目描述 Description

有一天,你需要打一份文件,但是你的键盘坏了,上面的"home"键和"end"键会时不时地按下,而你却毫不知情,甚至你都懒得打开显示器,当你打开显示器之后,出现在你的面前的是一段悲剧的文本。

输入描述 Input Description

输入只有一行,即这份文件,这份文件只包含小写字母和‘[‘以及‘]‘,用‘[‘代替"home"键,用‘]‘代替"end"键。

输出描述 Output Description

你的任务是在打开显示器之前,计算出这份悲剧的文档。

样例输入 Sample Input

kdg[gek]h[itj

de[co]vs

样例输出 Sample Output

itjgekkdgh

codevs

数据范围及提示 Data Size & Hint

包含多组测试数据,直到文件结束。

字符串长度小于10000个字符。

不包含空格。

分析:用’[’或’]’把字符串隔成几个部分,给几个部分按’[’或’]’附上编号,最后按编号排序输入。
     时间将近2000ms,空间也是擦边过,唏嘘一场。
 代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#define M 10010
using namespace std;
int front,behind;
char s[M];
struct node
{
    char ss[M/3];
    int num,len;
};node e[M/3];
bool cmp(const node&x,const node&y)
{
    return x.num<y.num;
}
int main()
{
    while(scanf("%s",s)!=EOF)
    {
        memset(e,0,sizeof(e));
        front=behind=0;
        int len=strlen(s),cnt=1;
        e[1].num=0;
        for(int i=0;i<len;i++)
        {
            char c=s[i];
            if(s[i]==‘[‘)
            {
                if(e[1].len)++cnt;
                e[cnt].num=--front;
            }
            else if(s[i]==‘]‘)
            {
                if(e[1].len)++cnt;
                e[cnt].num=++behind;
            }
            else e[cnt].ss[++e[cnt].len]=s[i];
        }
        sort(e+1,e+cnt+1,cmp);
        for(int i=1;i<=cnt;i++)
          for(int j=1;j<=e[i].len;j++)
            printf("%c",e[i].ss[j]);
        cout<<endl;
    }
    return 0;
}

时间: 2024-11-03 01:40:08

破损的键盘(codevs 4650)的相关文章

4650 破损的键盘

4650 破损的键盘 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有一天,你需要打一份文件,但是你的键盘坏了,上面的"home"键和"end"键会时不时地按下,而你却毫不知情,甚至你都懒得打开显示器,当你打开显示器之后,出现在你的面前的是一段悲剧的文本. 输入描述 Input Description 输入只有一行,即这份文件,这份文件只包含小写字母和'['以及']',用'['代替"

codevs 4650 破损的键盘(链表)

/* 之前一直不重视链表 (好吧说实话主要是看着板子都是指针就怂了T.T) 这道题比较基础 应用了链表的思想 数组模拟指针 遇到的问题就是跑着跑着光标跳到前面或者跳到后面 我们用next储存每个点下一个点在哪 这样我们不仅能往开头和结尾插入 中间任意一个地方都ok. 这题数据范围题目描述小了 0.0 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 100010 using nam

破损的键盘

[题目描述] 有一天,你需要打一份文件,但是你的键盘坏了,上面的"Home"键和"End"键会时不时地按下,而你却毫不知情,甚至你都懒得打开显示器,当你打开显示器之后,出现在你的面前的是一段悲剧的文本. [输入描述] 包含多组测试数据,每组数据只有一行,即这份文件,这份文件只包含小写字母和'['以及']',不包含空格,用'['代替"Home"键,用']'代替"End"键,长度小于10000个字符. [输出描述] 你的任务是在打

6_4 破损的键盘(UVa11988)&lt;链表&gt;

你用了一个有点坏掉的键盘打字,该键盘会自动按下”Home”键与“End”键,直到打完整个内容以前,你都没有发现到这个问题.本题给定键盘输出的字串(包含Home与End),请你输出该字串在屏幕显示的内容. Input输入有多组测试数据,每组一列,其长度介于1 ~ 100,000之间,包含小写的字母及两个符号'['与']','['表示Home键(被键盘自动按下),']'表示End键.输入数据以EOF表示结束,其数据长度不超过5MB. Output请你输出该字串在屏幕上显示的内容. Sample In

UVa 11988 破损的键盘(链表)

原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3139 题意就是输入文本,若是遇到"["光标就移到最前面,遇到"]"光标就移到最后. 在这段代码中,在for循环中如果不用n来代替strlen(s+1),最后就会超时,以后写代码的时候我会注意到这点. 1 #include<iostre

D - Broken Keyboard (a.k.a. Beiju Text) (破损的键盘)

You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem with the keyboard is that sometimes the "home" key or the "end" key gets automatically pressed (internally). You're not aware of this iss

例题6-4 破损的键盘 UVa11988

1.题目描述:点击打开链接 2.解题思路:本题利用链表解决.每输入一个字符,就把它存起来,设输入字符串是s[1...n],则可以用Next[i]表示在当前显示屏中s[i]右边的字符编号.为了便于后续处理,假设s的最前面还有一个虚拟的s[0](这是链表的常用处理方式,请务必牢记),那么Next[0]就表示显示屏中最左边的字符,再用一个变量cur表示光标位置:即当前光标位于s[cur]的右边(即我们的DOS窗口中经常出现的下一个待输入的位置).cur=0说明光标位于s[0]的右边,即显示屏的最左边.

破损的键盘(UVa 11988)

s[] 数组用来保存原有的字符序列 nex[] 数组记录打印的下标顺序 C++11 代码如下: 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 #define maxn 100006 5 char s[maxn]; 6 int nex[maxn], n; 7 8 int main() { 9 while (cin >> s + 1) { 10 int cur = 0, last = 0;

链表-破损的键盘 Uva 11988

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