给你两个串,可以交换两个串任意位置的字符,求交换之多2n次,能不能使得两个串相等,不能同一个串内交换,并且输出交换的次数和每次交换的位置。
有两种交换的方式,遍历两个串,遇到不匹配的字符,找S串中是否有和S当前位置一样的字符交换到T串的位置。
还有S串当前位置后没有合适的字符那么就找T串中匹配的字符交换两次先随便交换到S中的位置然后再换会T串对应的位置。
这两种都不符合的话就是没有答案
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<stack>
#include<iomanip>
#include<math.h>
using namespace std;
typedef long long ll;
typedef double ld;
const int INF = 0x3f3f3f3f;
int i,j,k;
int main()
{
int t;
cin>>t;
while(t--)
{
bool flag=0;
vector<pair<int, int> >ans;
int n;
cin>>n;
string s,t;
cin>>s>>t;
if(s==t)
{
cout<<"YES"<<endl;
cout<<"0"<<endl;
continue;
}
for(i=0; i<n; i++)
{
bool f1=0,f2=0;
if(s[i]==t[i])
{
continue;
}
for(j=i+1; j<n; j++)
{
if(s[i]==s[j])
{
swap(t[i],s[j]);
ans.push_back({j+1,i+1});
f1=1;
break;
}
}
if(f1)
continue;
for(j=i+1; j<n; j++)
{
if(s[i]==t[j])
{
swap(s[i+1],t[j]);
swap(s[i+1],t[i]);
ans.push_back({i+2,j+1});
ans.push_back({i+2,i+1});
f2=1;
break;
}
}
if(f2)
continue;
flag=1;
cout<<"NO"<<endl;
break;
}
if(flag)
continue;
if(ans.size())
{
cout<<"YES"<<endl;
cout<<ans.size()<<endl;
}
for(i=0; i<ans.size(); i++)
{
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
}
return 0;
}