[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;
}
标签:数字,int,题解,Move,Segment,ABC380C
From: https://www.cnblogs.com/adsd45666/p/18552565