【UVA-11988】解题报告(链表)

原始题目

题目大意

给出一段输入,‘[’表示“Home”键,即输入跳转到开头,‘]’表示“End”键,即输入跳至结尾。 输出最终实际文字。

解题思路

数组形式链表模拟。加空开头和尾。

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <cstdio>
#include <bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;++i)
#define per(i,a,n) for(int i=n-1;i>=a;--i)
#define clint(x,a) memset(x,a,sizeof(int)*n)
#define clll(x,a) memset(x,a,sizeof(ll)*n)
#define pb push_back
#define np next_permutation
#define mp make_pair
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define PI acos(-1.0)
using namespace std;
const int maxn=1e5+5;
const int maxm=1e5+5;
const int maxl=26;

char ss[maxn];
int nextt[maxn];
int main(){
ios::sync_with_stdio(false);

while(cin>>ss+1){
int last=0,cur=0;
memset(nextt,0,sizeof(nextt));
int len=strlen(ss+1);
rep(i,1,len+1){
if(ss[i]=='['){
cur=0;
}
else if(ss[i]==']') {
cur=last;
}
else {
nextt[i]=nextt[cur];
nextt[cur]=i;
if(cur==last) last=i;
cur=i;
}
}
for(int i=nextt[0];i!=0;i=nextt[i]){
cout<<ss[i];
}
cout<<endl;

}
}

收获与反思

  1. 数组形式链表,数组标号0作为空头结点,next[0]作为头节点的指针。
  2. 添加结点的操作为

    next[i]=next[cur] //加入结点的指针与前一结点的指针相同 next[cur]=i; //前一结点指针指向新结点 //由于本题还需要记录尾结点的序号所以有 //if(cur==last) last=i; cur=i; //指针移向当前结点