例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard,UVa 11988)—静态链表...
问题描述:
你有一个破损的键盘。键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下。你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开。当你打开显示器后,展现在你面前的是一段悲剧文本。你的任务是在打开显示器之前计算出这段悲剧文本。
输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“【”或者“】”。其中字符“【”表示Home键,“】”表示End键。输入结束标志为文件结束符(EOF)。输入文件不超过5MB。对于每组数据,输出一行,即屏幕上的悲剧文本。
样例输入:
This_is_a_[Beiju]_text
样例输出:
BeijuThis_is_a_text
【分析】
1、因为若用数组来保存这段文档,则太费时间(每输入一个字符都需要把后面的字符全部右移,给新字符腾出位置)这样的代码会超时。
2、所以决定采用静态链表来进行操作,(因为静态链表中有cur指向下一个元素,这样比较容易操作),为了方便起见,常常在链表的第一个元素之前放一个虚拟结点是s[0]。链表中插值时采用的尾插入法,比较方便。
3、关于Home与End键 从本体的样例输出可以看出,本题是需要将[ ]中的内容提到文档的前面,因为Home表示首位置,End表示末位置 。所以代码核心就是当读到 [ 时,给cur赋值0,读到 ] 时,给cur赋值last,读到其他字符时,尾插入法插值,cur及last后移。
代码如下:
#include <cstdio>
#include <cstring>
const int maxn=100000+5;
int last,cur,next[maxn];
char s[maxn];
int main(){
while(scanf("%s",s+1)){
int n=strlen(s+1);//计算字符串s的长度,并赋值给n
last=cur=0;
next[0]=0;//建一个虚拟位置点
for(int i=1;i<=n;i++){
char ch=s[i];
if(ch=='[') cur=0;//因为‘【’代表的home键,所以当光标指向【时,cur指针应指向首位置
else if(ch==']') cur=last;//同上,因为】代表的end键,所以当光标指向】时,cur指针应指向末位置
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;
}
运行结果:
总结:
1、在刚开始看到这道题的时候,因为不了解Home键和End键的具体功能,对代码中部的cur与last赋值不是很明白,在尝试之后,才理解为何Home给cur赋0,End给cur赋last;
2、看到strlen函数的时候,不太明白他表示的意思,去百度时看见有的代码的注释写的为 初始化链表(更加懵逼脸),在仔细百度strlen后。。一个计算字符串长度的函数(不包括
‘\0') 用到此处的目的是为了要计算出 s链表中存储的字符串的长度,便于之后for循环时的需要
转载于:https://www.cnblogs.com/zx-zhang/p/7719944.html
例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard,UVa 11988)—静态链表...相关推荐
- 【刘汝佳代码详解】例题6-4破损的键盘(Broken Keyboard,UVa 11988)
立志用最少的代码做最高效的表达 You're typing a long text with a broken keyboard. Well it's not so badly broken. The ...
- 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告
励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...
- 破损的键盘(悲剧的文本)Java UVa11988
破损的键盘(悲剧的文本)Java UVa11988 题目 分析 Java代码 还是算法作业之一,这次其实是一个acm题.网上查了一下,编号是UVa11988.废话不多说,直接上题. 题目 你有一个破损 ...
- 垃圾键盘(bushi) (悲剧文本)
问题 B: Broken Keyboard 时间限制: 1 Sec 内存限制: 128 MB 题目描述 You're typing a long text with a broken keyboard ...
- 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988)
例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988) 链表的应用 #include<iostream> # ...
- (链表,插入元素)破损的键盘
题目: 你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自 动按下.你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开.当你 打开显示器之后,展现在你面 ...
- 破损的键盘(刘汝佳-算法入门经典第六章)
感谢原文博主对此题的解释!笔者在原文基础上进行了部分注释以表达自己的理解,如有错误,恳请指正! 原文链接:https://blog.csdn.net/gyh_420/article/details/7 ...
- UVA-11988 悲剧文本-静态链表
你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自 动按下.你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开.当你 打开显示器之后,展现在你面前的是一 ...
- 全局异步和主线程异步区别、改变PlaceHolder颜色、解决键盘弹起挡住文本框问题...
1.全局异步执行耗时任务 dispatch_async(dispatch_get_global_queue(0, 0), ^{ }); 2.主线程异步刷新UI dispatch_async(dispa ...
最新文章
- 社交网络图挖掘2--社区的直接发现和图划分
- java 枚举 或运算_Objective-C 枚举 中位运算 的使用
- ddl是什么意思网络语_DDL语句是啥
- 改成中文版的_lol手游怎么改成中文版?英雄联盟手游中文版更改教程
- threejs 影子属性_影子场vs.属性访问器接口第2轮
- script标签中的defer和async属性
- 使用UInput模拟系统键盘鼠标动作 UInput driver分析
- Nginx取消泛解析
- 大数据(7) - zookeeper的安装与使用
- 时间序列分析实验报告总结_时间序列分析实验报告
- 一分钟学会Python中pip的安装与使用
- jmeter参数化测试-姓名生成
- 计算机用户文件夹加密,如何加密文件夹?手把手教你给文件夹加密方法
- NOIP模拟 位运算(trie树+按位贪心)
- [python] 多值参数(定义多值参数的函数、案例演练、元组和字典的拆包)
- php 长链接生成短链接
- C++文件服务器项目—FastCGI—4
- mysql binlog events_使用SHOW binlog events查看binlog内容
- 机器学习环境配置(Tesla K80安装PyTorch的全过程)
- 对于Jenkins和gitlab连接的注意事项