思路: 先满足 a 的条件 再一个个变满足 e
满足 a 之后 保底会产生abs ( cnta - a )个错误
之后每改变一次会产生 2 个错误 只要一个个找直到满足 e 即可
不存在的情况放前面特判 当( e - abs ( cnta - a ) )%!=0时 不存在 || 保底的错误(abs(cnta-a) > e 也不存在```c #include<bits/stdc++.h> #define ll long long using namespace std;
const ll N=2e6+10; char ans[N]; bool pd[N];
ll n,a,e; ll T; int main() { cin>>T; while (T--) { cin>>n>>a>>e; ll cnta=0,E=0;
for(int i=1;i<=2*n;i++)
{
pd[i]=false;
cin>>ans[i];
if(ans[i]=='A') cnta++;
}
if( (e - ( abs(cnta-a) ) )%2!=0 || e<( abs(cnta-a) ) )
{
cout<<-1<<endl;
continue;
}
if(cnta>a)
{
for(int i=1;i<=2*n;i++)
{
if(E+a==cnta) break;
if(ans[i]=='A')
{
ans[i]='B';
E++;
pd[i]=true;
}
}
}
else if(cnta<a)
{
for(int i=1;i<=2*n;i++)
{
if(cnta+E==a) break;
if(ans[i]=='B')
{
ans[i]='A';
E++;
pd[i]=true;;
}
}
}
if(E<e)
{
ll tb=1;
for(int i=1;i<=2*n;i++)
{
if(E==e) break;
if(ans[i]=='A'&&pd[i]==false)
{
for(int j=tb;j<=2*n;j++)
{
if(ans[j]=='B'&&pd[j]==false)
{
tb=j;
ans[j]='A';
ans[i]='B';
pd[i]=true;
pd[j]=true;
break;
}
}
E+=2;
}
}
}
for(int i=1;i<=2*n;i++)
{
cout<<ans[i];
}
cout<<endl;
}
return 0;
}