链接:https://www.luogu.com.cn/problem/CF1243B2
题意:给你长度为n的两个字符串s和t,你可以最多进行2*n次操作,每次操作选择i和j,然后交换s[i]和t[j],问你能否使得两个字符串相同
构造方法:假如(0~i)部分s和t已经相等,在i位置时首先在(i+1~t.size()-1)里找有没有和t[i]相同的字符,如果找到,则交换s[i]和t[j],如果找不到,则在s中找,找到之后,先将s[j]与t[t.size()-1],交换,再将s[i]与t[t.size()-1]交换这样的次数最多也就是2*n次;然后s=t;
代码:
#include<bits/stdc++.h> using namespace std; const int maxn=3e5+10; int n; string s,t; vector<pair<int ,int> > v; void solve() { cin>>n>>s>>t; v.clear(); for(int i=0; i<s.size(); i++) { if(s[i]!=t[i]) { int flag=0; for(int j=i+1; j<t.size(); j++) { if(t[i]==t[j]) { flag=1; v.push_back(make_pair(i+1,j+1)); swap(s[i],t[j]); break; } } if(!flag) { for(int j=i+1; j<s.size(); j++) { if(t[i]==s[j]) { flag=1; v.push_back(make_pair(j+1,t.size())); swap(s[j],t[t.size()-1]); v.push_back(make_pair(i+1,t.size())); swap(s[i],t[t.size()-1]); break; } } } if(!flag) { puts("NO\n"); return ; } } } puts("YES\n"); cout<<v.size()<<endl; for(int i=0; i<v.size(); i++) cout<<v[i].first<<" "<<v[i].second<<endl; return ; } int main() { int t; cin>>t; while(t--) solve(); return 0;}
原文地址:https://www.cnblogs.com/sweetlittlebaby/p/12683483.html
时间: 2024-10-09 08:57:18