DTOJ2444 祖玛

题目

题目描述

祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色
此后,你可以发射珠子到轨道上并加入原有序列中
一旦有三个或更多同色的珠子变成相邻,它们就会立即消失
这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子
在这里插入图片描述
开发商最近准备为玩家写一个游戏过程的回放工具
他们已经在游戏内完成了过程记录的功能,而回放功能的实现则委托你来完成
游戏过程的记录中,首先是轨道上初始的珠子序列,然后是玩家接下来所做的一系列操作
你的任务是,在各次操作之后及时计算出新的珠子序列

输入格式

第一行是一个由大写字母A~Z组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色
第二行是一个数字$n$,表示整个回放过程共有$n$次操作
接下来的$n$行依次对应于各次操作
每次操作由一个数字k和一个大写字母$\Sigma$描述,以空格分隔。其中,$\Sigma$为新珠子的颜色
若插入前共有$m$颗珠子,则$k\in [0,m]$表示新珠子嵌入之后(尚未发生消除之前)在轨道上的位序

输出格式

输出共$n$行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列
如果轨道上已没有珠子,则以-表示。

样例

样例输入

1
2
3
4
5
6
7
ACCBA
5
1 B
0 A
2 B
4 C
0 A

样例输出

1
2
3
4
5
ABCCBA
AABCCBA
AABBCCBA
-
A

数据范围与提示

$100 \%$的数据满足$1 \leqslant n \leqslant 10^3,1 \leqslant m \leqslant 2 \times 10^3$

题解

太TMD坑了,初始的珠子序列居然可以是空串!空串!空串!
考试使用scanf的我差点气死,本来可以第一名的……
这道题其实很简单,插入的时候使用strcpy直接插入,再判断一下插入后是否有连续的$3$个相同的字母
因为每次插入以后只改变插入的位置的字母,所以只需要判断插入的位置旁边是否有连续的$3$个的相同字母
因为有可能有连锁反应,所以修改后将当前的位置设为插入的位置前和插入的位置的颜色相同的位置我自己都被绕晕了
然后使用while即可
具体的实现看代码吧
附上代码:

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
#include<cstring>
#include<cstdio>
int n,ns,x;
char c,s[2010],temp[2010];
int xc(int p)
{
int f=p,l=p;
while(s[f]==s[p]&&f) f--;
if(f||s[f]!=s[p]) f++;
while(s[l]==s[p]&&l<ns) l++;
if(l-f>2){strcpy(temp,s+l),strcpy(s+f,temp),ns=ns+f-l,x=f;return 1;}
else return 0;
}
int main()
{
gets(s);
ns=strlen(s);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %c",&x,&c);
strcpy(temp,s+x),strcpy(s+x+1,temp),s[x]=c,ns++;
while(xc(x)&&ns);
if(ns) printf("%s\n",s);
else printf("-\n");
}
}