zoukankan      html  css  js  c++  java
  • B2. Character Swap (Hard Version)

    链接:

    http://codeforces.com/contest/1243/problem/B2

    题目大意:

    两个字符串,判断能否通过交换为从而使得这两个字符串完全一致,如不可以的话,直接输出NO,可以的话输出YES,并且输出每一步的交换位置。

    思路:如果没个字符出现的次数为偶数次的话,那么一定可以成功,否则的话一定是NO。

    如果说S[i]!=T[i],假如说,S中有与T[i]相同的元素,那么直接交换就可以了,操作次数为1,在T中找S[i]操作相同。

                 S中没有与T[i]相同的元素,我们保证了每个元素出先的次数为偶数次,那么在T中一定会有一个元素,我们只需要把在T中找一下S[i],然后将其与S中的某个元素交换一下,然后就变成了第一种情况,操作次数为2

    所以如果可以的,我们最多操作2*n次。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=100;
    struct stu{
        char a;
        int x1;
    }s1[N],t1[N];
    int ar[N],br[N];
    int arr[N];
    void solve(){
        memset(arr,0,sizeof arr);
        int n;
        cin>>n;
        string s,t;
        cin>>s>>t;
        for(int i=0;i<n;i++){
            arr[s[i]-'a']++;
            arr[t[i]-'a']++;
        }
        for(int i=0;i<27;i++){
            if(arr[i]&1){
                puts("NO");
                return ;
            }
        }
        int pos=1;        
        printf("YES
    ");
        for(int i=0;i<n;i++){
            if(s[i]!=t[i]){
                t1[pos].a=t[i];
                t1[pos].x1=i;
                s1[pos].a=s[i];
                s1[pos++].x1=i;
            }
        }
        int ans=0;
        int end1=s1[pos-1].x1;
        for(int i=1;i<pos;i++){
            bool flag=0;
            for(int j=i+1;j<pos;j++){//从t中寻找与t相等的字符 ,找到后直接交换 
                if(t1[j].a==t1[i].a) {
                    ans++;
                    flag=1;
                    ar[ans]=s1[i].x1+1;
                    br[ans]=t1[j].x1+1;
                    swap(s1[i].a,t1[j].a);
                    break;
                }
            }
            if(flag) continue ;
            for(int j=i+1;j<pos;j++){//从s中寻找与s相等的字符 
                if(s1[j].a==s1[i].a){
                    flag=1;
                    ans++;
                    ar[ans]=s1[j].x1+1;
                    br[ans]=t1[i].x1+1;
                    swap(s1[j].a,t1[i].a); 
                    break;
                }
            }
            if(flag) continue ;
            for(int j=i+1;j<pos;j++) //从t中寻找与s相等的,然后通过与某个数交换 
            {
                if(s1[i].a==t1[j].a){
                    ans++;
                    ar[ans]=end1+1;
                    br[ans]=t1[j].x1+1;
                    ans++; 
                    swap(t1[j].a,s1[pos-1].a);
                    swap(s1[pos-1].a,t1[i].a);
                    ar[ans]=end1+1;
                    br[ans]=t1[i].x1+1;
                    break;
                }
            }
        }
        printf("%d
    ",ans);
        for(int i=1;i<=ans;i++){
            cout<<ar[i]<<" "<<br[i]<<endl;
        }
        return ;
    }
    int main(){
        int t;
        cin>>t;
        while(t--) solve(); 
        return 0;
    }
  • 相关阅读:
    AJAX异步交互
    Java 异常讲解(转)
    Spring 配置文件详解 (以2.5为例)
    Java 获取当前系统时间方法比较
    Cannot change version of project facet Dynamic web module to 3.0
    使用 GCC 调试程序
    汇编 内存段划分和寄存器
    java.lang.StringBuilder
    java.lang.String
    建立和断开与MySQL服务器的连接
  • 原文地址:https://www.cnblogs.com/Accepting/p/11885731.html
Copyright © 2011-2022 走看看