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;
}
标签:洛谷,int,题解,cin,st,修改,P9539,now,anum
From: https://www.cnblogs.com/Wu-ZH/p/18357790