zoukankan      html  css  js  c++  java
  • A Game with Colored Balls

    题目链接

    • 题意:
      给一个长度为n的字符串,每次删除字母同样切连续的串,假设有多个,删除最左边的、最长的串。每次删除输出串的字母,每一个字母的下标(1-n)
      N (1 ≤ N ≤ 106),串仅仅包含red (‘R’), green (‘G’) or blue (‘B’) 
    • 分析:
      题目比較麻烦,分析一下须要的任务:
      1、每次找到最长串——优先队列
      2、删除最长串后,须要合并两側的串(假设字母同样)——加Hash的链表,set(超时)
      3、每次删除须要知道这一个区间的下标都是谁——加Hash的链表,set(超时)
    C++通过,G++超时……
    const int MAXN = 1100000;
    
    struct Node
    {
        int pos, len;
        char val;
        Node *nxt, *pre;
        Node (int p = 0, int n = 0, char v = 0) : pos(p), len(n), val(v) {}
        bool operator< (const Node& rhs) const
        {
            return pos < rhs.pos;
        }
        void erase()
        {
            pre->nxt = nxt;
            nxt->pre = pre;
        }
    } nd[MAXN], pt, fst, lst;
    int tot;
    
    struct HeapNode
    {
        int val, pos;
        HeapNode (int v = 0, int p = 0) : val(v), pos(p) {}
        bool operator< (const HeapNode& rhs) const
        {
            if (val != rhs.val)
                return val < rhs.val;
            return pos > rhs.pos;
        }
    } vt;
    
    priority_queue<HeapNode> q;
    char ipt[MAXN];
    bool vis[MAXN];
    Node* to[MAXN], *pit, *pl, *pr;
    int nxt[MAXN], pre[MAXN];
    
    void init(int n)
    {
        REP(i, n)
        {
            nxt[i] = i + 1;
            if (i)
                pre[i] = i - 1;
        }
    }
    void erase(int l, int r)
    {
        int p = pre[l], n = nxt[r];
        nxt[p] = n;
        pre[n] = p;
    }
    
    int main()
    {
        while (~RS(ipt))
        {
            fst.val = -1; fst.nxt = &lst; fst.pre = NULL;
            lst.val = -2; lst.pre = &fst; lst.nxt = NULL;
            CLR(vis, false);
            while (!q.empty())
                q.pop();
            tot = 0;
            int len = strlen(ipt);
            init(len + 2);
    
            nd[tot++] = Node(1, 1, ipt[0]);
            FF(i, 1, len)
            {
                if (ipt[i] == nd[tot - 1].val)
                    nd[tot - 1].len++;
                else
                {
                    nd[tot].pos = i + 1;
                    nd[tot].len = 1;
                    nd[tot].val = ipt[i];
                    tot++;
                }
            }
            fst.nxt = &nd[0]; nd[0].pre = &fst;
            lst.pre = &nd[tot - 1]; nd[tot - 1].nxt = &lst;
            REP(i, tot)
            {
                if (i != 0)
                    nd[i].pre = &nd[i - 1];
                if (i != tot - 1)
                    nd[i].nxt = &nd[i + 1];
                to[nd[i].pos] = &nd[i];
                q.push(HeapNode(nd[i].len, nd[i].pos));
            }
            while (!q.empty())
            {
                vt = q.top();
                q.pop();
                if (vt.val == 1)
                    break;
                if (vis[vt.pos])
                    continue;
                pt.pos = vt.pos;
                pit = to[vt.pos];
    
                int idx = vt.pos;
                printf("%c", ipt[vt.pos - 1]);
                REP(i, vt.val)
                {
                    printf(" %d", idx);
                    erase(idx, idx);
                    idx = nxt[pre[idx]];
                }
                puts("");
    
                pl = pit->pre; pr = pit->nxt;
                if (pl->val == pr->val)
                {
                    pl->len += pr->len;
    
                    vis[pr->pos] = true;
                    pr->erase();
    
                    q.push(HeapNode(pl->len, pl->pos));
                }
                vis[vt.pos] = true;
                pit->erase();
            }
        }
        return 0;
    }


  • 相关阅读:
    leetcode701. Insert into a Binary Search Tree
    leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes
    leetcode 110. Balanced Binary Tree
    leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
    二叉树
    leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
    5. Longest Palindromic Substring
    128. Longest Consecutive Sequence
    Mac OS下Android Studio的Java not found问题,androidfound
    安卓 AsyncHttpClient
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4038838.html
Copyright © 2011-2022 走看看