UVA11988:悲剧文本(模拟链表)

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 issue, since you’re focusing on the text and did not even turn on the monitor! After you ?nished typing, you can see a text on the screen (if you turn on the monitor). In Chinese, we can call it Beiju. Your task is to ?nd the Beiju text.

Input
There are several test cases. Each test case is a single line containing at least one and at most 100,000 letters, underscores and two special characters ‘[’ and ‘]’. ‘[’ means the “Home” key is pressed internally, and ‘]’ means the “End” key is pressed internally. The input is terminated by end-of-?le (EOF).
Output
For each case, print the Beiju text on the screen.

Sample Input

This_is_a_[Beiju]_text

[[]][][]Happy_Birthday_to_Tsinghua_University

Sample Output

BeijuThis_is_a__text

Happy_Birthday_to_Tsinghua_University

概译:我们在用键盘输入字符串,如果出现‘ [ ‘光标就跳到最前面,如果出现‘ ] ‘就跳到最后面,给出输入时的字符串输出实际得到的字符串,详见样例。

思路:水题轻喷……模拟,链表插入,可以用数组实现模拟链表。我模拟链表不太熟,第一次是用STL模拟的。可以用一个双端队列deque储存最终结果,遇到一个‘ [ ‘就把后面的字符放在stack里,再遇到‘ [ ‘或‘ ] ‘时把stack里的字符放在deque的front里。PS:可能WA的数据:abc[123[456[ef

STL比较慢,100msAC

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     string s;
 7     while(getline(cin,s))
 8     {
 9         s+=‘]‘;
10         deque<char>dq;
11         stack<char>st;
12         bool state=false;
13
14         for (int i = 0; s[i]; ++i)
15         {
16             if (s[i]==‘[‘)    state=true;
17             else if (s[i]==‘]‘)    state=false;
18
19             if(state)
20             {
21                 if(s[i]!=‘[‘)
22                     st.push(s[i]);
23                 else
24                     while(!st.empty())
25                     {
26                         dq.push_front(st.top());
27                         st.pop();
28                     }
29             }
30             else
31             {
32                 if(s[i]!=‘]‘)
33                     dq.push_back(s[i]);
34                 while(!st.empty())
35                 {
36                     dq.push_front(st.top());
37                     st.pop();
38                 }
39             }
40         }
41
42         while(!dq.empty())
43         {
44             printf("%c",dq.front());
45             dq.pop_front();
46         }
47         printf("\n");
48     }
49     return 0;
50 }

模拟链表是用一个next数组代替链表中的next指针,比如第一个字符s[1]的下一个是s[2],则next[1]=2。思想上和链表是一样的。另外众所周知,链表的题常常会把第0个作为不储存数据的辅助头结点,第一个下标才开始储存数据。

标程的思路是设置一个光标cur,但这个cur不是当前遍历到的位置i,而代表着位置i的字符应该插入在cur的右侧。期间cur有时会跳至左端即cur=0;有时要回到右端,所以还要开一个last变量保存最右端的下标,使cur=last跳回右端。

代码更精简,30ms,如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define maxl 100005
 4
 5 int main()
 6 {
 7     char s[maxl];
 8     while(~scanf("%s",s+1))
 9     {
10         int Next[maxl]={0};
11         int cur=0,last=0;
12
13         for (int i = 1; s[i]; ++i)
14         {
15             if(s[i]==‘[‘)    cur=0;
16             else if(s[i]==‘]‘)    cur=last;
17             else
18             {
19                 //链表插入操作
20                 Next[i]=Next[cur];
21                 Next[cur]=i;
22                 //last的更新
23                 if(cur==last)    last=i;
24                 //cur的更新
25                 cur=i;
26             }
27         }
28
29         for (int i = Next[0]; i != 0; i = Next[i])
30             if (s[i]!=‘[‘&&s[i]!=‘]‘)
31                 printf("%c",s[i]);
32         printf("\n");
33     }
34     return 0;
35 }

原文地址:https://www.cnblogs.com/AlphaWA/p/9280974.html

时间: 2024-08-26 01:27:27

UVA11988:悲剧文本(模拟链表)的相关文章

UVa11988 Broken Keyboard(悲剧文本)

UVa11988 Broken Keyboard(悲剧文本) 题目链接:UVa11988 题目描述: 输入包含多组数据,每组数据占一行,包含不超过100000个字母.下划线.字符"["或者"]".其中字符"["表示Home键,"]"表示End键.输入结束标志为文件结束符(EOF)输入文件不超过5MB,对于每组数据,输出一行,即屏幕上的悲剧文本 样例输入: This_is_a_[Beiju]_text [[]][]Happy_B

Broken Keyboard--又名悲剧文本(线性表)

 题目: 你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自 动按下.你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开.当你 打开显示器之后, 展现在你面前的是一段悲剧的文本.你的任务是在打开显示器之前计算出 这段悲剧文本. 输入包含多组数据.每组数据占一行,包含不超过100000个字母.下划线.字符"["或 者"]".其中字符"["表示Home键, "]"表示End键.输入结

Broken Keyboard(悲剧文本)

你有一个键盘,键盘上所有的键都能正常使用,只是Home键和End键有时会自动按下.你并不知道这一情况,而是专心地打稿子,甚至连显示器都没开电源.当你打开显示器之后,展现在你面前的是一段悲剧文本.你的任务是根据给出的键盘上实际输入的内容,计算并输出这段悲剧文本(即显示器上展现的文本) Input: 一行文本不超过1000000个字符,只包括字母.下划线.字符'['(表示Home键)和字符']'(表示End键盘). Output: 一个字符串,即符合题目描述的悲剧文本. Example: Input

UVa 11988 数组模拟链表

题目:在一个没有显示器的电脑上输入一个字符串,键盘坏掉了,会随机的出现home,和end按键, 字符串中'['代表home键(句首),']'代表end键(句尾),问最后输出的字符串的格式. 分析:模拟屏幕操作,移动光标,模拟缓冲区输出操作. 说明:数组模拟链表操作,跟随链表操作,形象化模拟. 1 // UVa11988 Broken Keyboard 2 // Rujia Liu 3 #include<cstdio> 4 #include<cstring> 5 const int

hdu5009 Paint Pearls (DP+模拟链表)

http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1951    Accepted Submission(s): 631 Problem Description Lee has a str

地震预测(模拟链表)

A - 地震预测 FZU - 1492 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一段时间的n次地壳震动能量的采样值为a1,a2,…an,那么第i 次采样的最小波动值为min{|ai-aj| | i<j<=n},即第i 次采样的最小波动值是其后n-i次采样值与第i次采样值之差的绝对值中最小的值,特别地,第n次采样的最小波动值为an. 请编写一个程序计算这n次采样的最小波动值之和. Input 本题有多

【日常学习】【SPFA负环+数组模拟链表实现】codevs2645 Spore题解

之前刚刚写了一道"香甜的黄油",是USACO的经典题目了.那道题用SPFA怎么找都过不了,看着别人的PAS轻松过各种拙计.黄学长说最佳方案应当是堆优化的dij,我还没有血,等学了那个之后再写黄油题解吧. 题目: 题目描述 Description 在星系1 的某颗美丽的行星之上.某陈将去标号为N 的星系,从星系g1 到达g2,某陈需要花费c1 的代价[主要是燃料,另外还有与沿途Grox 的势力作战的花费],c1 小于0 则是因为 这样的星系旅行,会给某陈带来收益[来源于物流差价,以及一些

UVa 11988 Broken Keyboard(模拟链表)

题意  有一个键盘坏了  会在你不知道的情况下按下home或者end  给你这个键盘的实际输入  要求输出显示器上的实际显示 输入最大5MB  所以直接数组检索肯定会超时的  用数组模拟链表  就可以很快了 #include<cstdio> #include<cstring> using namespace std; const int N=100005; char s[N]; int next[N]; int main() { int last,cur; while(~scanf

UVa12657 - Boxes in a Line(数组模拟链表)

题目大意 你有一行盒子,从左到右依次编号为1, 2, 3,…, n.你可以执行四种指令: 1 X Y表示把盒子X移动到盒子Y左边(如果X已经在Y的左边则忽略此指令).2 X Y表示把盒子X移动到盒子Y右边(如果X已经在Y的右边则忽略此指令).3 X Y表示交换盒子X和Y的位置.4 表示反转整条链. 盒子个数n和指令条数m(1<=n,m<=100,000) 题解 用数组来模拟链表操作,对于每个节点设置一个前驱和后继. 1操作是把x的前驱节点和x的后继节点连接,y节点的前驱和x节点连接,x节点和y