题面传送门

解决思路

首先容易得知,两个字符串中 \(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;
}

最新文章

  1. 私有无线传感网 PWSN HLINK
  2. mysql 导出批量导出表数据 (程序)
  3. redis geo 初探
  4. 使用SQLite数据库和Access数据库的一些经验总结
  5. bzoj 3170 manhattan距离
  6. Memcache存储大量数据的问题
  7. Hadoop Streaming Command Details and Q&amp;A
  8. 《JS权威指南学习总结--8.3 函数的实参和形参》
  9. Django:之传递数据给JS、Ajax和Ajax CSRF认证
  10. Hello English Again
  11. Snapde和常用的CSV文件编辑器对比
  12. java线程学习之join方法
  13. http://zaojiasys.jianshe99.com 建造师数据泄漏,可以查看全部所有人的信息!
  14. 2017-11-11 Sa Oct How to open a browser in Python
  15. FastCGI Error Number: 5 (0x80070005).
  16. Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
  17. git 配置别名
  18. python——append与extend
  19. ActiveReports 报表应用教程 (16)---报表导出
  20. Unity接SDK通用方法总结

热门文章

  1. 第七十六篇:ref引用(在vue中引用Dom的方法)
  2. Typora多线程批量上传图片,永久免费25G图床
  3. KingbaseES 的行列转换
  4. 【ajax】发送请求 —— 结合【express】框架 { }
  5. 1.关于433MHz按键单片机解码
  6. 容器化|自建 MySQL 集群迁移到 Kubernetes
  7. ProxySQL 使用情况报错问题汇总及解决办法
  8. 迁移阿里云上的ECS操作说明
  9. nsis制作新版迅雷安装界面
  10. 关于private子网访问s3时报错:Connect timeout on endpoint URL