题面传送门

解决思路

首先容易得知,两个字符串中 \(b\)(或 \(a\)) 的个数为偶数时,一定有解。为奇数则一定无解。

其次考虑怎么交换。对照样例三:

in:

8
babbaabb
abababaa

out:

3
2 6
1 3
7 8

发现,每一对交换的字符有共同点

  • 要不是串一都为 \(a\),串二都为 \(b\) 的一对

  • 要不是串一都为 \(b\),串二都为 \(a\) 的一对

简单思考后发现这样成对交换就是最优的。(换一次就可以匹配上两位)

于是,考虑先统计出 串一为 \(a\),串二为 \(b\) 的位数 \(cnt1\),并将相应位置存入 \(ans1\) 数组。同时统计出 串一为 \(b\),串二为 \(a\) 的位数 \(cnt2\),并将相应位置存入 \(ans2\) 数组。

这时发现一个问题,\(cnt1\) 和 \(cnt2\) 不一定为偶数,有可能不能各自成对匹配完。但可以发现, \(cnt1\) 与 \(cnt2\) 必同奇偶。由于偶数成对匹配更优,所以只可能剩下 一位串一为 \(a\),串二为 \(b\)一位串一为 \(b\),串二为 \(a\)

这时就出现了样例一的情况:

in:

4
abab
aabb

out:

2
3 3
3 2

所以只要按着样例一的顺序特判输出即可:

printf("%d %d\n",ans1[cnt1],ans1[cnt1]);
printf("%d %d\n",ans1[cnt1],ans2[cnt2]);

AC Code

#include<bits/stdc++.h>
using namespace std;
int n,ans1[200005],ans2[200005],cnt,cnt1,cnt2;
string s1,s2;
int main(){
scanf("%d",&n);
cin>>s1>>s2;
for(int i=0;i<n;i++){
if(s1[i]=='b') cnt++;
if(s2[i]=='b') cnt++;
}
if(cnt%2==1) printf("-1");
else{
for(int i=0;i<n;i++){
if(s1[i]=='a'&&s2[i]=='b') ans1[++cnt1]=i+1;
if(s2[i]=='a'&&s1[i]=='b') ans2[++cnt2]=i+1;
}
if(cnt1%2==0){
printf("%d\n",cnt1/2+cnt2/2);
for(int i=1;i<=cnt1;i+=2){
printf("%d %d\n",ans1[i],ans1[i+1]);
}
for(int i=1;i<=cnt2;i+=2){
printf("%d %d\n",ans2[i],ans2[i+1]);
}
}
else{
printf("%d\n",cnt1/2+cnt2/2+2);
for(int i=1;i<=cnt1-1;i+=2){
printf("%d %d\n",ans1[i],ans1[i+1]);
}
for(int i=1;i<=cnt2-1;i+=2){
printf("%d %d\n",ans2[i],ans2[i+1]);
}
printf("%d %d\n",ans1[cnt1],ans1[cnt1]);
printf("%d %d\n",ans1[cnt1],ans2[cnt2]);
}
}
return 0;
}

【题解】CF1215C Swap Letters的更多相关文章

  1. C. Swap Letters 01字符串最少交换几次相等

    C. Swap Letters time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. [LeetCode 题解]:Swap Nodes in Pairs

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a li ...

  3. Codeforces Round #585 (Div. 2) C. Swap Letters

    链接: https://codeforces.com/contest/1215/problem/C 题意: Monocarp has got two strings s and t having eq ...

  4. leetcode 题解 || Swap Nodes in Pairs 问题

    problem: Given a linked list, swap every two adjacent nodes and return its head. For example, Given ...

  5. LeetCode题解之Swap Nodes in Pairs

    1.题目描述 2.问题分析 对两个节点进行交换操作 3.代码 ListNode* swapPairs(ListNode* head) { if( !head || head->next == N ...

  6. leetcode个人题解——#24 Swap Nodes in Pairs

    因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...

  7. Codeforces 1215C. Swap Letters

    传送门 好像是个挺显然的贪心 首先每次交换当然要尽量一次交换就多两个相同的位置 即 优先把 $\begin{bmatrix}a\\ b\end{bmatrix}$ 和 $\begin{bmatrix} ...

  8. 题解 CF978C 【Letters】

    此题评测机出了点问题,数据全部AC,却显示UKE 下面是数据全部AC,却显示UKE的代码 思路:b[i]减去每个宿舍的房间总数,如果b[i]小于了某个宿舍的房间总数则为答案. #include< ...

  9. 题解 Wide Swap

    题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \tex ...

随机推荐

  1. 【JDBC】学习路径6-SQL插入、修改、删除数据

    第一章:插入使用.executeUpdate(); 返回的是受到影响的数据条数. public static boolean insert(String username,String passwor ...

  2. UE 实现镜头平移,旋转和缩放

    0x00 引 在数字孪生三维场景中,通过键盘和鼠标来控制镜头的移动,缩放是很常见的行为,也是很必要的行为,用户正是通过这些操作,达到对整个三维场景的观看和控制. 0x01 键盘控制镜头前后左右移动 通 ...

  3. C与C++有什么区别

    C是一个结构化语言,它的侧重点在于算法和数据结构.对语言本身而言,C是C++的一个子集. C程序的设计首要考虑的是如何通过一个过程,对输入进行运算处理,得到输出. 对于C++,首要考虑的是如何构造一个 ...

  4. bulk collect 在KingbaseES和Oracle的使用方法比较

    概述 BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNI ...

  5. Job And Schedule (V8R6C4)

    KingbaseES 数据库提供了 kdb_schedule 扩展,使得用户能通过类似oracle job 的方式进行job调用.kdb_schedule 提供了三个Schema :dbms_job ...

  6. Python中None作为索引的作用

    None的作用主要是在使用None的位置新增一个维度. a = np.arange(25).reshape(5,5) print(a) ''' [[ 0 1 2 3 4] [ 5 6 7 8 9] [ ...

  7. Java SE Object类

    1.Object类 equals 方法 == 和 equals 的对比 == 是一个比较运算符 == 既可以判断基本类型,又可以判断引用类型 == 如果判断的是基本类型,判断的是值是否相等 == 如果 ...

  8. C# 中的那些锁,在内核态都是怎么保证同步的?

    一:背景 1. 讲故事 其实这个问题是前段时间有位朋友咨询我的,由于问题说的比较泛,不便作答,但想想梳理一下还是能回答一些的,这篇就来聊一聊下面这几个锁. Interlocked AutoResetE ...

  9. TCP服务端收到syn但是不回复syn ack问题分析

    文章转载自:https://blog.csdn.net/jueshengtianya/article/details/52130667 最近在分析客户的一个问题时遇到了一种奇怪的情况,客户在服务端开启 ...

  10. MySQL数据库-数据表(下)

    分析:给 reader 表添加数据. INSERT INTO:插入数据,插入数据的时候会检查主键或者唯一索引,如果出现重复就会报错: 语法:INSERT INTO table_name VALUES ...