今天考了一场让我差点爆0的比赛,似乎最初只有10分。其中一题数据有误,修正过后也只是多了60分。

  改得很辛苦啊!


 

A:hao

【问题描述】
  祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。

  开发商最近准备为玩家写一个游戏过程的回放工具。他们已经在游戏内完成了过程记录的功能,而回放功能的实现则委托你来完成。

  游戏过程的记录中,首先是轨道上初始的珠子序列,然后是玩家接下来所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。
【输入格式】
  第一行是一个由大写字母'A'~'Z'组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。
  第二行是一个数字n,表示整个回放过程共有n次操作。
  接下来的n行依次对应于各次操作。每次操作由一个数字k和一个大写字母P描述,以空格分隔。其中, P为新珠子的颜色。若插入前共有m颗珠子,则k∈[0,m]表示新珠子嵌入之后(尚未发生消除之前)在轨道上的位序。
【输出格式】
  输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。

  如果轨道上已没有珠子,则以“-”表示。
【样例输入】
ACCBA
5
1 B
0 A
2 B
4 C
0 A
【样例输出】
ABCCBA
AABCCBA
AABBCCBA
-
A
【数据规模与约定】
100%的数据满足 1<=n<=10^3,1<=m<=2*10^3。


 

  嗯。既然每次都要输出结果,那么直接上链表肯定最方便。使用双向链表,0号点连接了最前和最后,当了哨兵和边界,用起来比较方便、

  但是,充分考虑祖玛的规则之后(许多同学为了深度理解祖玛的规则……呵呵你懂的),我们发现如果有连续的并没有用,需要一个操作(a+b>=3),才能消去。此处操作只有插入,与消去一次后两端加和的连锁消去。此处很重要,举个例子。

  若初始序列为AAACCBB,此时AAA不会立即消去。若将C凑够3个,C将消净,但AAA仍不会消去。但若再插入一个A,凑成了AAAA才会消去。

  这是2个点。

  还有,初始序列为空呢?唉!scanf就不该用啊。

  又是2个点。

  所以,所以。

 

 1 #define PN "hao"
 2 #include <cstdio>
 3 #include <cstring>
 4 const int N = 5000;
 5 int prev[N], next[N], col[N], tail, stack[N], top=0;
 6 char ss[N];
 7 inline int insert(int k,int c) {
 8     int p=0;for( int i = 0; i <= k; i++,p=next[p] );
 9     col[++tail]=c;
10     next[prev[p]]=tail;prev[tail]=prev[p];
11     next[tail]=p;prev[p]=tail;
12     return tail;
13 }
14 inline void clear(int p) {
15     int x, y, tot=0;
16     for(x=prev[p];x&&col[x]==col[p];x=prev[x],tot++);
17     for(y=next[p];y&&col[y]==col[p];y=next[y],tot++);
18     if(tot>=2) {
19         next[x]=y;prev[y]=x;
20         if(col[x]==col[y]) clear(x);
21     }
22 }
23 int main() {
24     freopen(PN".in","r",stdin);
25     freopen(PN".out","w",stdout);
26     int n, k, c;
27     gets(ss);scanf("%d",&n);
28     for( int len=strlen(ss), i = len-1; i >= 0; i-- ) insert(0,ss[i]);
29     for( int i = 1; i <= n; i++ ) {
30         scanf("%d",&k);while((c=getchar())==' '||c=='\n');
31         clear(insert(k,c));
32         for( int p = 0; col[next[p]]; p=next[p] ) printf("%c",col[next[p]]);
33         if(!col[next[0]]) printf("-");
34         printf("\n");
35     }
36     return 0;
37 }
hao

相关文章:

  • 2021-11-10
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-19
  • 2021-10-12
  • 2021-06-09
  • 2021-07-23
猜你喜欢
  • 2021-10-16
  • 2021-05-31
  • 2021-10-26
  • 2021-09-09
  • 2021-05-16
  • 2022-01-21
  • 2021-08-29
相关资源
相似解决方案