https://vjudge.net/problem/UVA-11988

题目

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

题解

服了= =

两年前看见这题……看不懂

几个月前看了邓公的数据结构课的链表大概知道是怎么回事了……(“邓俊辉的数据结构,贵系授课质量最好的课”)

个人思路:

写个双向链表……在Start后(需要更新cur)或End处插入元素……

如果在start处还需要记录当前的字符位置:

比如已经输入1和2,将要插入3……

可以定义个node结构体,包含last、next和ch三个元素,然后定义个node数组,直接操作就好了……

但是紫书上告诉我可以用单向链表,不用定义结构体……代码量还很小,不用分别是否在讨论Start和End插入

紫书上的答案:

如果使用单向链表,尝试理解了下书上给的答案

如果使用单向,那么End节点作用就不大,不能用End来找出之前的元素,直接定义为-1……在最后插入仍然需要记录当前的位置(如d)

那么在Start和End处的插入操作可以统一

那么大概就懂了……开始编码

#include<bits/stdc++.h>
using namespace std; #define REP(i,x,y) for(register int i=x; i<y; i++)
#define REPE(i,x,y) for(register int i=x; i<=y; i++) char s[100007];
int nxt[100007];
int lst, cur;
int main() {
while(~scanf("%s", s+1)) {
nxt[0]=-1;
cur=0;
for(int i=1; s[i]; i++) {
if(s[i]=='[') {
lst = cur;
cur = 0;
} else if(s[i]==']') {
cur = lst;
} else {
nxt[i]=nxt[cur];
nxt[cur]=i;
cur=i;
}
}
for(int i=nxt[0]; ~i; i=nxt[i]) {
putchar(s[i]);
}
putchar('\n');
}
return 0;
}

然后就WA了……

看到标程,发现Home键可能不止按下一次……有点悲剧

AC代码:

#include<bits/stdc++.h>
using namespace std; #define REP(i,x,y) for(register int i=x; i<y; i++)
#define REPE(i,x,y) for(register int i=x; i<=y; i++) char s[100007];
int nxt[100007];
int lst, cur;
int main() {
while(~scanf("%s", s+1)) {
nxt[0]=-1;
cur=0, lst=0;
for(int i=1; s[i]; i++) {
if(s[i]=='[') {
cur = 0;
} else if(s[i]==']') {
cur = lst;
} else {
nxt[i]=nxt[cur];
nxt[cur]=i;
if(lst==cur) lst=i;
cur=i;
}
}
for(int i=nxt[0]; ~i; i=nxt[i]) {
putchar(s[i]);
}
putchar('\n');
}
return 0;
}

然后感叹: 刘老爷是真的牛批,邓公的数据结构课是真的毛……

UVA 11988 Beiju Text的更多相关文章

  1. 破损的键盘(悲剧文本)(Broken Keyboard(a.k.a. Beiju Text),Uva 11988)

    破损的键盘(悲剧文本)(Broken Keyboard(a.k.a. Beiju Text),Uva 11988) 题意描述 你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下. ...

  2. UVA 11988 Broken Keyboard (a.k.a. Beiju Text)(链表)

    题目代号:UVA 11988 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&pa ...

  3. UVA——11988 Broken Keyboard (a.k.a. Beiju Text)

    11988 Broken Keyboard (a.k.a. Beiju Text)You’re typing a long text with a broken keyboard. Well it’s ...

  4. UVa 11988 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 wi ...

  5. Broken Keyboard (a.k.a. Beiju Text) UVA - 11988

    You're typing a long text with a broken keyboard. Well it's not so badly broken. The only problem wi ...

  6. uva - Broken Keyboard (a.k.a. Beiju Text)(链表)

    11988 - Broken Keyboard (a.k.a. Beiju Text) You’re typing a long text with a broken keyboard. Well i ...

  7. UVa 11988 Broken Keyboard(链表->数组实现)

    /*数组形式描述链表:链表不一定要用指针. 题目链接:UVa 11988 Broken Keyboard 题目大意: 小明没有开屏幕输入一个字符串,电脑键盘出现了问题会不定时的录入 home end ...

  8. B - Broken Keyboard (a.k.a. Beiju Text)

    Problem B Broken Keyboard (a.k.a. Beiju Text) You're typing a long text with a broken keyboard. Well ...

  9. B - 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 wi ...

随机推荐

  1. Ambari 使用 Hive View 异常处理

    异常:进入Hive View提示user home check fail 详细日志:Service 'userhome' check failed: java.io.FileNotFoundExcep ...

  2. GC调优入门笔记

    想给项目代码做做调优但有许多疑惑,比如有哪些参数要调.怎么调.使用什么工具.调优的效果如何定量测量等.发现Oracle的这份资料不错,简洁直接,回答了我的许多问题,给了许多很实用的大方向上的指导.将其 ...

  3. Bing.com在.NET Core 2.1上运行!

    Bing.com在.NET Core 2.1上运行! 相关知识请参考.netCore开发团队博客(https://blogs.msdn.microsoft.com/dotnet/) Bing.com是 ...

  4. nodeJs配置

    1.  vi /etc/profile export NODE_HOME=/opt/node-v6.9.1-linux-x64export PATH=$PATH:$NODE_HOME/binexpor ...

  5. 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目)

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...

  6. case when then的用法-leetcode交换工资

    case具有两种格式:简单case函数和case搜索函数. --简单case函数 case sex when ' then '男' when ' then '女’ else '其他' end --ca ...

  7. Vue基本使用和指令集

    Vue的使用 一.安装 对于新手来说,强烈建议大家使用<script>引入: 二. 引入vue.js文件 我们能发现,引入vue.js文件之后,Vue被注册为一个全局的变量,它是一个构造函 ...

  8. 学习PHPExcel

    关于PHPExcel使用方法,可以参考慕课网的教程,链接在此 PHPExcel的github地址:https://github.com/PHPOffice/PHPExcel 下载之后,将文件夹中的Cl ...

  9. java kill thread command line

    multithreading - How do you kill a Thread in Java? - Stack Overflowhttps://stackoverflow.com/questio ...

  10. cent6.x配置主机名及静态网络

    # 修改网卡名为NAME="eth0" [root@jenkins ~]# -persistent-net.rules # This file was automatically ...