「AWOI Round 2 B」树学
题目
题目大意:
在字典序最小的情况下让 a 和 b 相同元素个数在 l~r 之间
思路:
因为 'a' 最小,所以先在改动数目小于 r 的情况下把所有能变成 'a' 且本来不是 'a' 的字符变成 'a' ; 如果改动数目小于 l 就从最后一个开始没改过(如果没计算有没有改过会错 3 个点,只能得 20 分)的字符变成 'a' 变成 b 。就可以让字典序最小且合法。
#include<iostream>
#include<string>
using namespace std;
bool t[1000005];//是否被计算过
int main()
{
int n,l,r,sum;
string s;//a数列
cin>>n>>l>>r>>s;
sum=n;//重复个数
for(int i=0;i<n;i++)
{
if(sum<=l)break;//改的够了
if(s[i]!='a')
{
s[i]='a';
t[i]=1;//被改过
sum--;
}
}
for(int i=n-1;i>=0;i--)//没改够
{
if(sum<=r)break;//够了
if(t[i])continue;//已经被改过
if(s[i]=='a')s[i]='b';
else s[i]='a';//一般情况下不会出现
sum--;
}
cout<<s<<endl;
return 0;
}