[ABC380C] Move Segment 题解

[ABC380C] Move Segment 题解

本题主要考察思维能力,其实不难。

题目大意

给你一个字符串 \(s\)\(s\)\(0\)\(1\) 构成,将其分为块中只有一种数字的块。将给定的第 \(k\) 块数字为 \(1\) 的块与第 \(k-1\) 块合并,并输出修改后的字符串。

思路分析

直接按照题意模拟即可。建立结构体数组表示每个块,变量 \(s\) 为本块的数字, \(len\) 为块的长度。将 \(s\) 遍历一遍,初始化结构体数组,又因为 \(s\) 只由 \(0\)\(1\) 组成,可知第 \(k\) 块数字为 \(1\) 的块的编号应为 \(2 \times k\) ,那么将其与上一个数字为 \(1\) 的块,其实也就是将其与编号为 \(2 \times k-1\) 的数字为 \(0\) 的块交换位置,然后输出即可。

code

#include <bits/stdc++.h>
#define seq(q, w, e) for (int q = w; q <= e; q++)
#define ll long long
using namespace std;
const int maxn = 1e6+10,inf=0x7fffffff;
struct node{
    int len;
    int s;
}a[maxn];
string s1;
int n,k,tot;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>k;
    cin>>s1;
    tot=1;
    for(int i=0;i<n;i++){
        if(s1[i]-'0'==a[tot].s)
            a[tot].len++;
        else{
            tot++;
            a[tot].s=s1[i]-'0';
            a[tot].len=1;
        }
    }
    swap(a[2*k],a[2*k-1]);
    seq(i,1,tot)
        seq(j,1,a[i].len)
            cout<<a[i].s;
    return 0;
}
posted @ 2024-11-18 14:34  adsd45666  阅读(18)  评论(0编辑  收藏  举报