Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造

链接: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;
}

 

猜你喜欢

转载自www.cnblogs.com/sweetlittlebaby/p/12683483.html