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[maxn];
char s[maxn];

int main()
{
    //freopen("in.txt","r",stdin);
    while(gets(s+1)){
        int head = 0, cur = 0, tail = 0; nxt[0] = -1;
        for(int i = 1; s[i]; i++){
            if(s[i] == ‘[‘) cur = head;
            else if(s[i] == ‘]‘) cur = tail;
            else {
                nxt[i] = nxt[cur];
                nxt[cur] = i;
                if(cur == tail) tail = i;
                cur = i;
            }
        }
        for(int i = nxt[head]; ~i; i = nxt[i] ){
            putchar(s[i]);
        }
        putchar(‘\n‘);
    }
    return 0;
}
时间: 2024-11-03 21:13:45

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)

题目传送门 题意:训练之南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(数组模拟链表)

题目链接: 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 #i

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)

题意:有一个键盘坏了  会在你不知道的情况下按下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) STL

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