(链表,插入元素)破损的键盘
题目:
你有一个破损的键盘。键盘上的所有键都可以正常工作,但有时Home键或者End键会自 动按下。你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开。当你 打开显示器之后,展现在你面前的是一段悲剧的文本。你的任务是在打开显示器之前计算出 这段悲剧文本。
输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“[”或
者“]”。其中字符“[”表示Home键,“]”表示End键。输入结束标志为文件结束符(EOF)。输
入文件不超过5MB。对于每组数据,输出一行,即屏幕上的悲剧文本。
样例输入:
This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University
样例输出:
BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University
分析与解答:
这题怎么说呢,刘汝佳一上来就把链表的核心抛出来了,我足足看了两个小时才理解,不过利用数组表示单链表也掌握了
0.为了方便起见,常常在链表第一个元素之前放一个虚拟节点s[0]
1.光标cur,最后一个字符编号last,其实只是由于这题home,end的条件限制
如果用数组建立单链表,只需要next[i]和s[i]
2.其中next[i]是s[i]连的下一个字符的编号,比如:
s[0],next[0]=3连下一个字符->
s[next[0]],next[next[0]]
3.在本题中,如果next[i]=0,说明不知道这个节点连哪个下一个节点,如果全部插入完节点,遇到next[i]=0,就意味着这个链表已经结束
所以有如下对链表遍历的方法:
for(int i=next[0];i!=0;i=next[i])printf("%c",s[i]);
4.下面说说怎么插入
s[i]对应一个next[i],那么s[i]下一个连的是s[next[i]],next[next[i]]
如果在s[i]后面插入s[j]next[j]
只需next[j]=next[i],next[i]=j
新节点j先插到后面next[i]的前面,再把前面i的后面连的那个节点改为新插入的那个j
5.再来说说本题
a.只需改变s的输出顺序,输出s[next[i]]
b.多了个[],就是说插入的位置会发生变化,怎么办?
光标派上用场,
先看一般情况:s[0]0a1b2c3,注意光标的意思,假设光标一开始是0,你输入a,那1就是此时光标的位置,假设s[1]=a,那我们还没遍历到b的时候,next[1]=0(看不懂得话看上面的黑色重点字体),next[0]=1,这是在s[0]后面插入s[1],(看不懂的话看重新看上面的4),此时如果光标等于最后一个字符的编号(比如last,cur初始值是0,那么你加了一个字符,最后一个字符编号自然需要更新)就更新最后一个字符编号,然后把光标改成1
再看特殊的:
如果碰见[,光标跑到0了,把cur改成0
碰见],光标跑到最后一个了数的后面了,你们发现了吗,最后一个数的下标正好是光标的下标,所以cur=last
6.悟道是acmer的必经之路,多看几个小时,就明白了
#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);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;
}
(链表,插入元素)破损的键盘相关推荐
- 单链表插入元素 注释 c语言,数据结构之无头单链表的相关练习题——C语言实现(详细注释)...
本文中所用到的相关链表操作实现均在我上篇博客中:https://blog..net/haoziai905/article/details/87099287 1.删除无头单链表的非尾结点 这道题的重点就 ...
- 数据结构专题(二):2.3链表插入元素,尾插法
因为结构内存的差异,所以有头插法和尾插法两种形式. 本章博客主要讲解头插法 操作流程如下图 如下代码: ///插入元素,在指定的位置插入给定的值 //因为链表这种结构的内存是由程序员管理的,因此他的建 ...
- 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现
写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...
- 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard,UVa 11988)—静态链表...
问题描述: 你有一个破损的键盘.键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下.你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开.当你打开显示器后,展现在你面前 ...
- 往有序链表的插入元素使原链表依旧有序
/*在有序链表中插入元素时,最好设置两个指针,一前一后, cur指针负责比较大小,pre指针负责定位插入位置的前驱.[关键点] (1)3中情况:空链表.第一个值比插入元素大.非空链表&& ...
- boost::unorder_map如何插入元素_链表和有序二叉树插入元素时真的比数组快吗?
脚本之家 你与百万开发者在一起 作者 | focuscode出品 | 脚本之家(ID:jb51net) 公司有位C++标准委员会的顾问大佬,一年会有几次视频讲座,分享一些编程要点或者经验.很多时候都是 ...
- 数据结构专题(二):2.5在链表指定位置插入元素
如下代码: ///插入元素,在指定位置插入给定的值 //在指定位置之后插入 void insert_After_LkList(LinkListNode *ptr,ElemType x) {LinkLi ...
- 破损的键盘(悲剧的文本)Java UVa11988
破损的键盘(悲剧的文本)Java UVa11988 题目 分析 Java代码 还是算法作业之一,这次其实是一个acm题.网上查了一下,编号是UVa11988.废话不多说,直接上题. 题目 你有一个破损 ...
- 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988)
例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988) 链表的应用 #include<iostream> # ...
最新文章
- Visual Studio 11增强HTML5和JS的支持
- 缓存技术比拼:Redis与Memcached的同与不同
- LeetCode 08字符串转整数09回文数
- 上传文件到服务器的Linux命令
- Linux 下从命令行打开pdf文件和html文件的命令
- 拖动窗体的任意区域移动窗体
- 解决新浪微盘下载没反应下载中断
- * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。
- linux7配置网卡绑定,CentOS7双网卡绑定配置
- python模块typing的作用
- 搭载华为HiCar 新宝骏跨界融合打造智能出行生态圈
- azure api 管理_通过成本管理跟踪Azure成本
- Guava 相关文章
- IDM认证过程日志埋点说明
- 计算机管理无线网络 win10,如何在Windows 10中使用命令行管理WIFI无线网络
- 51单片机堆栈深入剖析(转)
- MDK AC6开启FPU移植DSP库时报错Error: L6242E: Cannot link object arm_cos_f32.o as its attributes are incompat
- win10 安装 GPU版TensorFlow
- 【逆向工程】在PE结构空白区段插入代码
- 电脑蓝屏解决方案:DPC WATCHDOG VIOLATION