Loading

洛谷P9539 「AWOI Round 2 B」树学 题解

Problem

Solution

题目要求字典序最小,所以一定要尽可能多的 \(a\),而且要尽可能靠前。

所以我们只需修改不是 \(a\) 的位置为 \(a\) 即可。

但若 \(a\) 的个数比 \(r\) 大,我们就需要将多余的 \(a\) 手动改为 \(b\) 并在接下来的修改中保持不变,所以定义一个 \(vis_i\) 表示是否一定不能修改。

注意这里要从后往前考虑,而修改要从前往后考虑。

Code

#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i>=(b);i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)

const int N=1e6+4;
int n,l,r;
bool g[N];
string st;
int main()
{
	IOS;
	cin>>n>>l>>r;
	cin>>st;
	int anum=0;
	For(i,0,n-1)if(st[i]=='a')anum++;
	if(anum>r)
	{
		l=r;
		FOR(i,n-1,0)
		{
			if(anum==r)break;
			if(st[i]=='a')g[i]=1,st[i]='b',anum--;
		}
	}
	int mnum=n-l,now=0;
	For(i,0,n-1)
		if(g[i]==0)
		{
			if(now==mnum)break;
			if(st[i]!='a')st[i]='a',now++;
		}
	cout<<st;

	return 0;
}
posted @ 2024-08-13 21:57  ๑҉v  阅读(21)  评论(0)    收藏  举报