Codeforces Round #599 (Div. 2) B. Character Swap

题目地址:http://codeforces.com/contest/1243/problem/B2

题意:给你两个长度为n的字符串s1,s2,问在2*n的次数交换中(互相交换),能否变成两个一样的字符串,能的话输出交换方法。

思路:只要所有字符数量都是2的倍数,那肯定能换到。遍历找不一样的,s2中能否找到和s2当前一样的,能的话直接换到s1去,不能就在s1中找,找到后和s2的最后位置换,再用s2最后的和s1当前位置换即可。

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7 typedef long long ll;
 8 void sol1(){    //这是B1的
 9     int n;
10     cin>>n;
11     char s1[10005],s2[10005];
12     scanf("%s%s",s1,s2);
13     int num=0,a[5]={0};
14     for(int i=0;i<n;i++){
15         if(s1[i]!=s2[i]){
16             num++;
17             a[num-1]=i;
18         }
19         if(num==3){
20             cout<<"No"<<endl;
21             return ;
22         }
23     }
24     if(num==0) cout<<"Yes";
25     else if(num==2){
26         if(s1[a[0]]==s1[a[1]]&&s2[a[0]]==s2[a[1]])
27             cout<<"Yes"<<endl;
28         else cout<<"No"<<endl;
29     }
30     else cout<<"No"<<endl;
31 }
32 void sol2(){
33     int n;
34     cin>>n;
35     char s1[55],s2[55];
36     scanf("%s%s",s1,s2);
37     int a[26]={};
38     for(int i=0;i<n;i++){
39         a[s1[i]-'a']++;
40         a[s2[i]-'a']++;
41     }
42     for(int i=0;i<26;i++)
43         if(a[i]%2){
44             cout<<"No"<<endl;
45             return ;
46         }
47     vector<pair<int, int> >ans;
48     for(int i=0;i<n;i++){
49         if(s1[i]==s2[i]) continue;
50         int j=i+1;
51         while(s2[j]!=s2[i]&&j<n) j++;
52         if(j==n){   //s2中没找到
53             int k=i+1;
54             for( ;k<n;k++)  //在s1中找
55                 if(s1[k]==s2[i]) break;
56             swap(s1[k],s2[n-1]);
57             ans.push_back({k,n-1});
58             j--;
59         }
60         swap(s1[i],s2[j]);
61         ans.push_back({i,j});
62     }
63     cout<<"Yes"<<endl;
64     cout<<ans.size()<<endl;
65     for(auto i : ans)       //我的编译器会出错,但codefoces网站里是可以用的
66         cout<<i.first+1<<" "<<i.second+1<<endl;
67 }
68 int main(){
69     int q;
70     cin>>q;
71     while(q--) sol2();  //sol1()
72     return 0;
73 }

 

posted @ 2019-11-11 21:11  xunzf  阅读(124)  评论(0编辑  收藏  举报