小白进阶之路- CodeForces-1215C-deque的骚操作

 

题意:给你两个长度相同的只含有 'a' ,'b' 的字符串,每次可以交换串1的一个字符和串2的一个字符,求最小操作数使得两个串相同,不能做到输出 -1;

题目链接:点击查看

 

分析:类型 ① :a -> b; ② : a -> a; ③ :b -> a;

类型②不操作;相同类型进行操作一次使得两个位置相同。

特殊情况 : 类型 ①③奇偶性不同,无解。

一般情况 :同奇,改变一个位置的类型,即自我调换,使得两个类型同偶数。

                   同偶,一次改变两个位置的类型,即一次拿出两个位置进行交换操作。

 

骚操作:deque支持随机下标访问。

反思:题意理解错误,误以为只能进行下标不同的操作。下次要好好理解题意再进行思考。

 

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<cmath>
#include<string>
#include<vector>
#include<cstring>
#define ll long long
#define  ull unsigned long long
#define pb push_back
// #define memset(a,n) memset(a,n,sizeof(a))
#define mp make_pair
using namespace std;
const int maxn = 2e5 + 100;
void FAST()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
}

deque<int> q1,q2; // q1 : a -> b; q2 : b -> a;
vector<pair<int,int> > q;



int main()
{
    FAST(); 
    int n;cin >> n;string s1,s2;cin >> s1 >> s2;
    for(int i = 0 ;i < n;i++){
        if(s1[i] == s2[i]) continue;
        if(s1[i] == 'a') q1.push_back(i+1);
        else q2.push_back(i+1);
    }
    if(q1.size() % 2 == 0 && q2.size() & 1){ // 特殊情况类型 ①③奇偶性不同,无解
        printf("-1\n");return 0;
    }else if(q1.size() & 1 && q2.size() % 2== 0){
        printf("-1\n");return 0;;
    }
    if(q1.size() & 1){ // 同奇数情况
        int pos = q2.front();q2.pop_front();
        q.push_back(make_pair(pos,pos));
        q1.push_back(pos);
    }
    while(!q1.empty()){ // 一次拿出两个位置进行修改;
        q.push_back(make_pair(q1[0],q1[1]));
        q1.pop_front();q1.pop_front();
    }
    while(!q2.empty()){ // 一次拿出两个位置进行修改;
        q.push_back(make_pair(q2[0],q2[1]));
        q2.pop_front();q2.pop_front();
    }
    printf("%d\n",q.size());
    for(int i = 0 ; i < q.size();i++) {
        printf("%d %d\n",q[i].first,q[i].second);
    }
    // system("pause");
}

 

posted @ 2020-04-30 21:39  Wise_4  阅读(190)  评论(0编辑  收藏  举报