Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造
Posted sweetlittlebaby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 "); return ; } } } puts("YES "); 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;
}
以上是关于Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version) 构造的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #599 Div2解题报告A-D
Codeforces Round #599 (Div. 2)
Codeforces Round #599 (Div. 2)
Codeforces Round #599 (Div. 2) C. Tile Painting
Codeforces Round #599 (Div. 2) A. Maximum Square
Codeforces Round #599 (Div. 2) B1. Character Swap (Easy Version)