zoukankan      html  css  js  c++  java
  • 祖玛(Zuma)

    祖玛(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.

    img

    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

    1. 原理与要点:用一个字符串来模拟插入和删除的操作,插入时直接将其放在要插入的位置,然后把后面的后移一位。删除时扫描整个字符串,出现三个及以上连续的便删掉,为了优化删除的时间复杂度,用了一个栈做辅助。
    2. 遇到的问题:
    3. 时间和空间复杂度: 一次插入时间复杂度(O(n)),一次删除时间复杂度(O(n)),总体时间复杂度(O(n^2)),空间复杂度(O(n))
    4. 特别或创新:用一个栈做辅助,使得删除时只需遍历字符串一遍。
    #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] = '';
        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] = '';
    }
    
    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("-
    ");
            } else {
                printf("%s
    ", str + 1);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    MySQL -- select count(1) 计算一共有多百少符合条件的行
    Python3 -- 文件I/O总结(with、read、write、txt、CSV等)
    Linux -- wget 之 FTP篇
    Linux -- head/tail 查看文件的指定行数
    linux -- 查看linux磁盘容量和文件夹所占磁盘容量
    Linux -- 查询某个文件夹下的文件数量
    Python3 -- 查看python安装路径以及pip安装的包列表及路径
    Python3 --Linux 编码注释# -*- coding:utf-8 -*-
    VisualStudio2013 如何打开之前版本开发的(.vdproj )安装项目
    const int *p与int *const p的区别(转:csdn,suer0101)
  • 原文地址:https://www.cnblogs.com/albert-biu/p/11542130.html
Copyright © 2011-2022 走看看