题解:CF1243B2 Character Swap (Hard Version)
yushihan123 · · 题解
首先我们先来考虑怎么判断 Yes 和 No,只要判断一下每个字母的数量是不是有偶数个就可以了,如果是奇数肯定不能平均分配给 Yes 和 No 还要复杂一点)。
接下来就要考虑如何操作,使得
我们可以设
如果
如果
注意:
那么这种方法的操作次数是否不超过
可以发现如果
代码如下:
#include<bits/stdc++.h>
using namespace std;
char s[55],t[55];
int sl[30],l[30];
struct Node{
int l,r;
}ans[105];
int main(){
int k;
scanf("%d",&k);
while(k--){
int n;
scanf("%d",&n);
scanf("%s%s",s+1,t+1);
int cnt=0;
for(int i=0;i<26;i++) l[i]=sl[i]=0;
for(int i=1;i<=n;i++){
sl[s[i]-'a']++;
l[s[i]-'a']++;
l[t[i]-'a']++;
}
int f=0;
for(int i=0;i<26;i++){
if(l[i]%2){
f=1;
break;
}
}
if(f){
printf("No\n");
continue;
}
printf("Yes\n");
for(int i=1;i<=n;i++){
if(s[i]!=t[i]){
if(sl[s[i]-'a']*2<=l[s[i]-'a']){
swap(s[i],t[i]);
ans[++cnt]={i,i};
sl[t[i]-'a']--;
sl[s[i]-'a']++;
for(int j=i+1;j<=n;j++){
if(t[i]==t[j]&&s[j]!=t[j]){
swap(s[i],t[j]);
ans[++cnt]={i,j};
sl[t[j]-'a']--;
sl[s[i]-'a']++;
break;
}
}
}
else{
for(int j=i+1;j<=n;j++){
if(s[i]==s[j]&&s[j]!=t[j]){
swap(s[j],t[i]);
ans[++cnt]={j,i};
sl[t[i]-'a']--;
sl[s[j]-'a']++;
break;
}
}
}
}
}
printf("%d\n",cnt);
for(int i=1;i<=cnt;i++){
printf("%d %d\n",ans[i].l,ans[i].r);
}
}
return 0;
}