题目:

你有一个破损的键盘。键盘上的所有键都可以正常工作,但有时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;
}

(链表,插入元素)破损的键盘相关推荐

  1. 单链表插入元素 注释 c语言,数据结构之无头单链表的相关练习题——C语言实现(详细注释)...

    本文中所用到的相关链表操作实现均在我上篇博客中:https://blog..net/haoziai905/article/details/87099287 1.删除无头单链表的非尾结点 这道题的重点就 ...

  2. 数据结构专题(二):2.3链表插入元素,尾插法

    因为结构内存的差异,所以有头插法和尾插法两种形式. 本章博客主要讲解头插法 操作流程如下图 如下代码: ///插入元素,在指定的位置插入给定的值 //因为链表这种结构的内存是由程序员管理的,因此他的建 ...

  3. 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现

    写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...

  4. 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard,UVa 11988)—静态链表...

    问题描述: 你有一个破损的键盘.键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下.你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开.当你打开显示器后,展现在你面前 ...

  5. 往有序链表的插入元素使原链表依旧有序

    /*在有序链表中插入元素时,最好设置两个指针,一前一后, cur指针负责比较大小,pre指针负责定位插入位置的前驱.[关键点] (1)3中情况:空链表.第一个值比插入元素大.非空链表&& ...

  6. boost::unorder_map如何插入元素_链表和有序二叉树插入元素时真的比数组快吗?

    脚本之家 你与百万开发者在一起 作者 | focuscode出品 | 脚本之家(ID:jb51net) 公司有位C++标准委员会的顾问大佬,一年会有几次视频讲座,分享一些编程要点或者经验.很多时候都是 ...

  7. 数据结构专题(二):2.5在链表指定位置插入元素

    如下代码: ///插入元素,在指定位置插入给定的值 //在指定位置之后插入 void insert_After_LkList(LinkListNode *ptr,ElemType x) {LinkLi ...

  8. 破损的键盘(悲剧的文本)Java UVa11988

    破损的键盘(悲剧的文本)Java UVa11988 题目 分析 Java代码 还是算法作业之一,这次其实是一个acm题.网上查了一下,编号是UVa11988.废话不多说,直接上题. 题目 你有一个破损 ...

  9. 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988)

    例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988) 链表的应用 #include<iostream> # ...

最新文章

  1. Visual Studio 11增强HTML5和JS的支持
  2. 缓存技术比拼:Redis与Memcached的同与不同
  3. LeetCode 08字符串转整数09回文数
  4. 上传文件到服务器的Linux命令
  5. Linux 下从命令行打开pdf文件和html文件的命令
  6. 拖动窗体的任意区域移动窗体
  7. 解决新浪微盘下载没反应下载中断
  8. * 有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数? * 把这些数都输出出来,并且输出总共的个数。
  9. linux7配置网卡绑定,CentOS7双网卡绑定配置
  10. python模块typing的作用
  11. 搭载华为HiCar 新宝骏跨界融合打造智能出行生态圈
  12. azure api 管理_通过成本管理跟踪Azure成本
  13. Guava 相关文章
  14. IDM认证过程日志埋点说明
  15. 计算机管理无线网络 win10,如何在Windows 10中使用命令行管理WIFI无线网络
  16. 51单片机堆栈深入剖析(转)
  17. MDK AC6开启FPU移植DSP库时报错Error: L6242E: Cannot link object arm_cos_f32.o as its attributes are incompat
  18. win10 安装 GPU版TensorFlow
  19. 【逆向工程】在PE结构空白区段插入代码
  20. 电脑蓝屏解决方案:DPC WATCHDOG VIOLATION

热门文章

  1. C#中IEnumerableT.GroupBy()的简单使用
  2. 文字描边_6招迅速做出炫酷PPT字效!|10分钟干货第二期(文字描边)
  3. vip会员管理系统c语言,路西牌会员管理系统。
  4. php实现文本替换,php 如何实现文字替换
  5. html设置数字显示位数,数字万用表的显示位数和精度
  6. windows7自带录制屏幕怎么用
  7. 腾讯视频怎么删除收藏的内容
  8. myEclipse背景控制插件方案 内附使用说明
  9. Oracle数据库,当DML操作时执行触发器记录日志
  10. Spring事务配置实例