题解:AT_abc380_c [ABC380C] Move Segment

Binah_cyc

2024-11-18 07:44:03

Solution

思路很简单,先把所有的连续段都存起来,然后找到第 k1 段,把它和前面的那一段交换。具体的代码实现可以参照我的代码。

代码

// Problem: C - Move Segment
// Contest: AtCoder - AtCoder Beginner Contest 380
// URL: https://atcoder.jp/contests/abc380/tasks/abc380_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
char s[500005];
vector<pair<char,int> > vec;//first存的是这一段的元素种类,second存的是这一段的元素个数
signed main()
{
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>s[i];
    int cnt=1;
    for(int i=2;i<=n;i++)//跳过第一个位置
    {
        if(s[i]!=s[i-1]) vec.emplace_back(s[i-1],cnt),cnt=0;//这个位置和上一个位置不同,说明这是一个新块的起点
        cnt++;
    }
    vec.emplace_back(s[n],cnt);//将最后一段推进去
    int num=0;
    for(unsigned i=0;i<vec.size();i++)
    {
        if(vec[i].first=='1') num++;//统计1段的个数
        if(num==k) {swap(vec[i],vec[i-1]);break;}//第k个1段,将它和前面的交换
    }
    for(auto [x,y]:vec) for(int i=1;i<=y;i++) cout<<x;//输出即可
    return 0;
}