UVA 11988 链表

之前遇到字典树什么的要不就用指针链表,要不直接上list。

数组链表主要思想和指针差不多。

指针是用*next记录下一个的地址然后形成链。

数组本身开辟空间时便是一个地址所以也可以达到这点。

比如 int a[11];     a[0]=1;   a[1]=2;  a[2]=4; a[4]=3;

a[a[0]]=a[1]=2这样就达到了将 1 2 4 3 接到一起。

仔细分析一下数组a的下标再不断增大,但是记录的数据却在更新。

所以可以大致写出

int next[11];

int now=0;     //光标

for(int i=1;i<=n;i++)

{

next[i]=next[now];   //   更新数据

next[now]=i;    // 记录位置

now++;    //光标移动

}

不同题目光标跳动方式不同,现在上例题

小紫书UVA 11988

题目大意输入一串字符(空格用‘_‘代替)其中字符‘[’表示HOME建(光标移到最前面)  字符 ‘]‘ 表示END键(光标移到最后)  输出运行后的字符串(长度100000);

样例输入   This_is_a_[Beiju]_text

样例输出   BeijuThis_is_a_text

拿到题目如果字符串长度小的话可以直接暴力模拟。

不过字符串长为100000的话如果插入一个数到最前面后面的都要往后移动这样时间量就大了(系统不想跟你说话同时丢给你一个TLE)

所以要用到链表

不同的是光标可能跳到最前面或者最后面所以要设一个变量记录当前最后的位置

代码如下

#include<stdio.h>

#include<string.h>

#define Max 100000

int main()

{

char s[Max+5];

int next[Max+5];

int now;

while(~scanf("%s",s+1))         //从第1位开始保留0位作为起始

{

memset(next,0,sizeof(next));

int i,ed=0;                             //设置当前最后位置为0

now=0;                                  //初始化光标

for(i=1;i<=strlen(s+1);i++)

{

if(a[i]==‘[‘)  now=0;            //光标移至最前

else if(a[i]==‘]‘)  now=ed;  //光标移至最后

else {

next[i]=next[now];         //更新next数组

next[now]=i;

if(ed==now) ed=i;     //更新末位

now=i;                      //更新光标

}

for(i=next[0];i!=0;i=next[i])

printf("%c",s[i]);

printf("\n");

]

}

时间: 2024-11-06 11:40:51

UVA 11988 链表的相关文章

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

Broken Keyboard (a.k.a. Beiju Text) From:UVA, 11988 Time Limit: 1000 MS 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 "hom

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 这题可以看出c++中string效率的底下

用c语言实现 #include <iostream> #include <string.h> #include <stdio.h> using namespace std; typedef struct node { char x; struct node *next; }chan; chan *root = new chan; char a[100010]; int main() { while(scanf("%s" , a) != EOF) {

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 块状链表

其实链表就可以搞定,不过分析一下感觉块链也可以过,就套模板试了一下,果然没有让我失望,看来我写的块链还是不错的,哈哈. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int M = 100001; 7 const int N = 500; 8 char text[M]; 9 char b[N][N]; 10 int sz[N]

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 破损的键盘(链表)

原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3139 题意就是输入文本,若是遇到"["光标就移到最前面,遇到"]"光标就移到最后. 在这段代码中,在for循环中如果不用n来代替strlen(s+1),最后就会超时,以后写代码的时候我会注意到这点. 1 #include<iostre

链表 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