祖瑪(Zuma)
Description
Let's play the game Zuma!
There are a sequence of beads on a track at the right beginning. All the beads are colored but no three adjacent ones are allowed to be with a same color. You can then insert beads one by one into the sequence. Once three (or more) beads with a same color become adjacent due to an insertion, they will vanish immediately.
Note that it is possible for such a case to happen for more than once for a single insertion. You can't insert the next bead until all the eliminations have been done.
Given both the initial sequence and the insertion series, you are now asked by the fans to provide a playback tool for replaying their games. In other words, the sequence of beads after all possible eliminations as a result of each insertion should be calculated.
Input
The first line gives the initial bead sequence. Namely, it is a string of capital letters from 'A' to 'Z', where different letters correspond to beads with different colors.
The second line just consists of a single interger n, i.e., the number of insertions.
The following n lines tell all the insertions in turn. Each contains an integer k and a capital letter Σ, giving the rank and the color of the next bead to be inserted respectively. Specifically, k ranges from 0 to m when there are currently m beads on the track.
Output
n lines of capital letters, i.e., the evolutionary history of the bead sequence.
Specially, "-" stands for an empty sequence.
Example
Input
ACCBA
5
1 B
0 A
2 B
4 C
0 A
Output
ABCCBA
AABCCBA
AABBCCBA
-
A
Restrictions
0 <= n <= 10^4
0 <= length of the initial sequence <= 10^4
Time: 2 sec
Memory: 256 MB
- 原理與要點:用一個字符串來模擬插入和刪除的操作,插入時直接將其放在要插入的位置,然后把后面的后移一位。刪除時掃描整個字符串,出現三個及以上連續的便刪掉,為了優化刪除的時間復雜度,用了一個棧做輔助。
- 遇到的問題:無
- 時間和空間復雜度: 一次插入時間復雜度\(O(n)\),一次刪除時間復雜度\(O(n)\),總體時間復雜度\(O(n^2)\),空間復雜度\(O(n)\)
- 特別或創新:用一個棧做輔助,使得刪除時只需遍歷字符串一遍。
#include "iostream"
#include "cstdio"
#include "cstring"
using namespace std;
const int maxn = 2e4 + 100;
bool vis[maxn];
char str[maxn];
int m, pos;
struct no {
int num;
char ch;
} st[maxn];
void ins(int pos, char op) {
int len = strlen(str + 1);
str[len + 2] = '\0';
for (int i = len + 1; i > pos + 1; i--) {
str[i] = str[i - 1];
}
str[pos + 1] = op;
}
void _delete() {
int len = strlen(str + 1);
int tot = 0;
for (int i = 1; i <= len; i++) {
if (tot == 0) {
tot++;
st[tot].num = 1;
st[tot].ch = str[i];
} else if (st[tot].ch == str[i]) {
st[tot].num++;
} else if (st[tot].ch != str[i]) {
if (st[tot].num >= 3) {
tot--;
if (tot != 0 && st[tot].ch == str[i]) {
st[tot].num++;
} else {
tot++;
st[tot].ch = str[i];
st[tot].num = 1;
}
} else {
tot++;
st[tot].num = 1;
st[tot].ch = str[i];
}
}
}
if (tot != 0 && st[tot].num >= 3) tot--;
int cnt = 1;
for (int i = 1; i <= tot; i++) {
for (int j = 0; j < st[i].num; j++) {
str[cnt++] = st[i].ch;
}
}
str[cnt] = '\0';
}
int main() {
char op;
cin.getline(str + 1, maxn - 2);
scanf("%d", &m);
while (m--) {
scanf("%d %c", &pos, &op);
ins(pos, op);
_delete();
if (strlen(str + 1) == 0) {
printf("-\n");
} else {
printf("%s\n", str + 1);
}
}
return 0;
}