zoukankan      html  css  js  c++  java
  • [CF909D] Colorful Points

    Description

    给定一个串,每轮进行如下操作:如果一个字符的相邻字符中存在与它不同的,则这个字符被选中,选好所有字符后将这些字符同时删除,该轮结束。问操作多少次后无法再删除任何点。

    Solution

    将相同的连续段合并成一个结点,用链表维护

    每次遍历所有节点,头尾值 -1,中间值 -2,如果某个节点值 (le 0) 了就删除它

    (对 stl::list 还是不熟悉)

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    struct Node
    {
        char c;
        int x;
    };
    
    list<Node> l;
    string s;
    int n;
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        cin>>s;
        int t_cnt=0;
        n=s.length();
        for(int i=0;i<n;i++)
        {
            ++t_cnt;
            if(i==n-1 || s[i]!=s[i+1])
            {
                l.push_back({s[i],t_cnt});
                t_cnt=0;
            }
        }
    
        int flag=1,last=0,ans=0;
        while(l.size()>1)
        {
            ++ans;
            for(auto it=l.begin();it!=l.end();it++)
            {
                it->x-=2;
            }
            l.begin()->x++;
            l.rbegin()->x++;
            for(auto it=l.begin();it!=l.end();it++)
            {
                if(it->x<=0) it=l.erase(it), it--;
            }
            for(auto it=l.begin();it!=l.end();it++)
            {
                auto t_it=it;
                t_it++;
                if(t_it==l.end()) break;
                while(t_it->c==it->c)
                {
                    it->x+=t_it->x;
                    t_it=l.erase(t_it);
                    if(t_it==l.end()) break;
                }
            }
            /*for(auto i:l) cout<<i.c<<"*"<<i.x<<" ";
            cout<<endl;*/
        }
        cout<<ans<<endl;
    }
    
    
  • 相关阅读:
    SpringBoot配置文件
    SpringBoot基础开发流程
    day06-01数字类型、数字类型的转换
    特有的循环结构(for-else、while-else)——Python篇
    分支、循环——Python基础篇
    循环关键字——Python篇
    另类三目运算符——Python篇
    原码、反码以及补码
    Python运算符
    Python变量
  • 原文地址:https://www.cnblogs.com/mollnn/p/13615411.html
Copyright © 2011-2022 走看看