Uva11988破损的键盘
作者:互联网
Uva11988破损的键盘
题目
有一个键盘,破了,在输入的时候会随机不间断的向文本中插入End
和Home
字符
(end
:跳到待输入语句的末尾,在输入语句中用[
表示;Home
:跳到待输入语句的开头,用]
表示)。
现请你编写程序,读入字符串,输出相应的结果。
分析
- 一种做法是采用
vector
,之后直接用insert
函数,碰到[
字符,在碰到]
字符之前,将所有内容插到没出现之前的地方。- 问题:insert函数的效率低下,即使只是插入一个字母都得让之后的所有字母位置挨个向后移动一位。此题的数据体量巨大,必然超时。
- 另一种方法更为高效:构建一个专门存储访问次序的数组
nxt
,cur
作为访问的光标;- 遇到特殊符号之前,将顺序
i
(i
= 1,2,3,4,5...)依次递增。遇到特殊符号之后,cur
跳转到末尾/开头,并将顺序i
的值赋给:nxt[cur]
- 如此,构建一个访问顺序的数组
nxt
,然后根据数组的值依次访问,输出字符就行了。
- 遇到特殊符号之前,将顺序
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 10;
int cur,last,nxt[maxn];
char s[maxn];
int main()
{
int n = strlen(s+1);
last = cur = 0; //cur用来当作光标,根据情况的变化移到最前或最后
s[0] = 0; //nxt数组专门用来存储访问的顺序
while(scanf("%c", s+1) == 1) { //细节:将s[0]设置为0,从s+1开始存储
for(int i = 1; i <= n; i++) {
char ch = s[i];
if(ch == '[')
cur = 0;
else if(ch == ']')
cur = last;
else {
nxt[i] = nxt[cur]; //更新nxt数组的值,nxt[cur]专门用来存储新的值
nxt[cur] = i;
if(cur == last)
last = i;
cur = i;
}
}
for(int i = nxt[0]; i != 0; i = nxt[i])
printf("%c", s[i]);
}
return 0;
}
标签:破损,cur,nxt,int,键盘,访问,maxn,字符,Uva11988 来源: https://www.cnblogs.com/sungoesdown/p/16364706.html