小白进阶之路- 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"); }