リンク:https : //www.luogu.com.cn/problem/CF1243B2
トピック:長さnの2つの文字列sとtを与えるには、最大2 * nの操作を実行し、各操作に対してiとjを選択してから、s [i]とt [j]を交換して、できるかどうか尋ねます2つの文字列を同じにするかどうか
構築方法:(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; 文字列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]); ブレーク; } } 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]); ブレーク; } } } if(!flag) { puts( "NO \ n"); 戻る; } } } puts( "YES \ n"); cout << v.size()<< endl; for(int i = 0; i <v.size(); i ++) cout << v [i] .first << "" << v [i] .second << endl; 戻る; } int main() { int t; cin >> t; while(t--) solve(); 0を返します。
}