博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA——11988 Broken Keyboard (a.k.a. Beiju Text)
阅读量:6643 次
发布时间:2019-06-25

本文共 2489 字,大约阅读时间需要 8 分钟。

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 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 finished 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 find 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-file (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

 

看到这个题我们是不是就想到我们可以用一个数组储存一下每一个字母然后当这个字母要换到前面的时候,我们再讲这些字母跟后面的字母换一下位置不就好了吗,但是我们考虑一下时间复杂度,我们要将前面的字母挨个移到后面,然后在for循环将后面的字母都到前面,这样的话如果我们遇到的是a与[交替出现的字符串,如果这个字符串长度达到25000那么我们的时间复杂度就已经达到了6*10^9了,哈哈,是不是就T成狗了,所以我们要想个好点的做法,我们把知道链表可以做到数组的插入,因此我们考虑用链表来做这道题

讲解详见代码

#include
#include
#include
#include
#define N 101000using namespace std;char s[N];int now,last,net[N];//我们用now记录当前字母的前驱,last记录我们更正顺序以后的新串中的最后一个字母在原串中的位置,net[i]记录i后面的字母的位置 int main(){ while(scanf("%s",s+1)==1)//读入字符串 { int l=strlen(s+1);//计算字符串的长度 now=last=0,net[0]=0;//初始化 for(int i=1;i<=l;i++) { if(s[i]=='[') now=0;//我们遇到[我们需要讲这个[]里面的字母全部移动到最前面,因此括号里面第一个字母的前驱为0 else if(s[i]==']') now=last;//我们已经处理完[]里面的字母了,接下来我们要接着处理,我们[]出来以后的第一个字母的前驱为新串中的最后一个字母在原串 中的位置 //例如This_is_a_[Beiju]_text我们处理完[Beiju]以后接下来扫到的字母为_因为我们已经把[Beiju]放到最前面了,那么_的前驱即为_,因此now=last else // { net[i]=net[now];//个人认为他除了在最后记录一下链表结束的情况没有什么卵用,因为nex[i]在后面还会被赋值 net[now]=i;//记录now的后记 if(now==last) last=i;//当now==last的时候只有两种情况,一种是还没有开始处理[]一种是[]已经被处理完了,在这种情况下我们需要更新last值,否则因为我们要把[]移到最前面,那么新串中的最后一个字母一定不是括号中的这些字母 now=i; } } for(int i=net[0];i!=0;i=net[i]) printf("%c",s[i]); printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/z360/p/7724534.html

你可能感兴趣的文章
Python实现MySQL DBA小工具一例
查看>>
YodaOS 中是如何生成 API 的?
查看>>
Android 中Fragment的自动重建
查看>>
在 iOS 平台实现Ping 和 traceroute
查看>>
小猿圈python学习-嵌套&匿名&高阶函数
查看>>
element-ui 版本升级对比
查看>>
js 整理
查看>>
OOM
查看>>
Java Socket基础(二)
查看>>
基于Squid3.0的反向代理加速实现
查看>>
我的友情链接
查看>>
Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色
查看>>
Jenkins Master/Slave架构
查看>>
[每日短篇] 9 - 去外包公司工作好还是不好?
查看>>
我的友情链接
查看>>
设计模式之创建型模式—— 1.4 单例模式
查看>>
Keepalived无法绑定VIP故障排查经历
查看>>
Linux Shell 程序调试
查看>>
php安装
查看>>
PHP操作XML(三)——RSS
查看>>