zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    抓取猫眼电影top100的正则、bs4、pyquery、xpath实现方法
    Win实用好用软件清单推荐
    Manjaro安装配置美化字体模糊发虚解决记录
    爬取杭电oj所有题目
    Python爬取微博热搜以及链接
    20191225_Python构造函数知识以及相关注意事项
    java_细节_windows7下记事本保存为utf-8格式的问题
    基础_划分子网
    爬虫_爬取有道每日一句
    算法_基础_伪代码定义以及遵循的规则
  • 原文地址:https://www.cnblogs.com/xunzf0402/p/11838504.html
Copyright © 2011-2022 走看看