UVa 11988 Broken Keyboard(数组模拟链表)

题目链接:

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

 1 /*
 2 问题 将一段文本经过一定的规则处理后输出,规则就是[表示home键,表示光标跳到行首,]表示end键,表示光标跳到行末
 3
 4 解题思路
 5 可以发现[]是可以嵌套的,采用纯模拟比较复杂,采用类似KMP中的next数组一样,记录一下每个字符的下一个字符位置,最后
 6 输出即可。
 7 */
 8 #include<iostream>
 9 #include<cstdio>
10 #include<cstring>
11 #include<list>
12 const int maxn=101000;
13 using namespace std;
14
15 char str[maxn];
16 int nex[maxn];
17 int main()
18 {
19     int i,len,cur,las;
20     //freopen("E:\\testin.txt","r",stdin);
21     while(scanf("%s",str+1) != EOF){
22         len=strlen(str+1);
23         cur=las=0;
24         nex[0]=0;
25         for(i=1;i<=len;i++){
26             if(str[i] == ‘[‘)
27                 cur=0;
28             else if(str[i] == ‘]‘)
29                 cur=las;
30             else{
31                 nex[i]=nex[cur];
32                 nex[cur]=i;
33                 if(cur == las)    las = i;
34                 cur =i;
35             }
36         }
37
38         for(i=nex[0];i != 0;i=nex[i]){
39             printf("%c",str[i]);
40         }
41         puts("");
42     }
43     return 0;
44 } 

原文地址:https://www.cnblogs.com/wenzhixin/p/9129716.html

时间: 2024-11-09 18:52:17

UVa 11988 Broken Keyboard(数组模拟链表)的相关文章

UVa 11988 Broken Keyboard(链表的应用)

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 (inter

UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解

刘汝佳的题目,悲剧文本 -_-||| 这里使用vector<string>容器倒置记录数据,然后从后面输出就可以了. 难度就是不知道这样的文档到底哪里是开始输出,故此使用动态管理内存的容器比较好做. 增加了io处理的O(n)算法也没有上榜,郁闷. #include <stdio.h> #include <vector> #include <string> using std::vector; using std::string; const int MAX_

UVa 11988 Broken Keyboard(模拟链表)

题意  有一个键盘坏了  会在你不知道的情况下按下home或者end  给你这个键盘的实际输入  要求输出显示器上的实际显示 输入最大5MB  所以直接数组检索肯定会超时的  用数组模拟链表  就可以很快了 #include<cstdio> #include<cstring> using namespace std; const int N=100005; char s[N]; int next[N]; int main() { int last,cur; while(~scanf

Uva 11988 Broken Keyboard STL+链表

两种方法,直接上代码 STL标准模板库 #include <iostream> #include <list> #include <algorithm> #include <cstdio> using namespace std; const maxn=100000+5; char str[maxn]; typedef list<char> L; int main(){ while(gets(str)){ L l; L::iterator p;

uva 11988 - Broken Keyboard (a.k.a. Beiju Text)

题意:有一个键盘坏了  会在你不知道的情况下按下home或者end  给你这个键盘的实际输入  要求输出显示器上的实际显示 解析:输入最大5MB  直接数组检索肯定会超时,用 数组模拟链表 next数组表示显示屏中s[i]右边的字符编号,变量cur模拟光标,即当前光标位于s[cur]的右边. 变量last记录显示屏最后一个字符的下标. 1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 const in

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

题目传送门 题意:训练之南P244 分析:链表模拟,维护链表的head和tail指针 #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; struct Link_list { char ch; Link_list *nex; }link_list[N]; int main(void) { while (true) { Link_list *head = link_list; Link_list *q = li

UVA 11988 Broken Keyboard (链表)

简单题,题目要求显然是很多次插入,所以是链表. acm里链表出场率并不高,但是实际应用中还是蛮多的.想想一年前这个时候连c语言都不会,真是感慨... 插入两个语句,nxt[i] = nxt[u] 表示 i结点指向u的后继, nxt[u] = i表示把u的后继设成i. 设置一个头结点,指向一个不存在的结点,维护一下最后一个结点tail. #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+5; int nxt[max

Uva 11988 Broken Keyboard

因为要经常移动这些字符,所以采用的数据结构是链表. next[i]起到的作用大概就是类似链表里的next指针. 0.需要注意的是,判断cur == last ? 如果 是 则 last=i 1.另外一点是,输入的时候把next[0]空出来,起链表里面空白头结点的作用.所以输入的时候有个小改动 从s+1开始填入字符,计算长度的时候也是从s+1开始计算,s代表的是这个数组的首地址. 2.直接往oj上交的时候要注意,next数组名要改一下 2. 1 while(~scanf("%s",s+1

UVA 11988 Broken Keyboard (a.k.a. Beiju Text) STL

题目链接: UVA...... 题目描述: 给出一个字符串, 其中遇到"["是光标到最前, 遇到']'时光标又回到最后, 输出最后的文本 解题思路: 用到STL, 设置变量flag维护光标的位置, 当遇到纯字母时, 组合起来当做字符串处理, 在遇到下一个非纯字母时, 根据flag的状态一起插进deque的最前或者最后 代码: #include <iostream> #include <cstdio> #include <string> #includ