题目地址: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 }