题意
在一个没有显示器的电脑上输入一个字符串,键盘坏掉了,会随机的出现home,和end按键,
字符串中'['代表home键(句首),']'代表end键(句尾),问最后输出的字符串的格式。
题解
用一个数组nxt[]来保存每个字符接下来的编号,假设字符串s前还有一个虚拟的s[0],则字符串的最左边就可以表示为nxt[0],注意不要使用next来作为数组的名字,否则会编译错误。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <set>
#include <map>
using namespace std;
const int maxn=100005;
char s[maxn];
int nxt[maxn];
int main()
{
while(scanf("%s",s+1)==1)
{
memset(nxt,0,sizeof(nxt));
int last,cur;
last=cur=0;//last记录字符串的尾部
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
if(s[i]=='[') cur=0;
else if(s[i]==']') cur=last;//光标移动到末尾
else
{
nxt[i]=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]);
}
printf("\n");
}
return 0;
}