Codeforces Round#599(Div。2)B2。キャラクタースワップ(ハードバージョン)

リンク: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を返します。
}

 

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/sweetlittlebaby/p/12683483.html