【CF585-div2:C】Swap Letters(贪心)

题目地址:https://codeforces.com/contest/1215/problem/C

题目:


Monocarp has got two strings ?s and ?t having equal length. Both strings consist of lowercase Latin letters "a" and "b". 

Monocarp wants to make these two strings ?s and ?t equal to each other. He can do the following operation any number of times: choose an index ???1pos1 in the string ?s, choose an index ???2pos2 in the string ?t, and swap ????1spos1 with ????2tpos2.

You have to determine the minimum number of operations Monocarp has to perform to make ?s and ?t equal, and print any optimal sequence of operations — or say that it is impossible to make these strings equal.

Input

The first line contains one integer ?n (1≤?≤2⋅105)(1≤n≤2⋅105) — the length of ?s and ?t.

The second line contains one string ?s consisting of ?n characters "a" and "b". 

The third line contains one string ?t consisting of ?n characters "a" and "b". 

Output

If it is impossible to make these strings equal, print −1−1.

Otherwise, in the first line print ?k — the minimum number of operations required to make the strings equal. In each of the next ?k lines print two integers — the index in the string ?s and the index in the string ?t that should be used in the corresponding swap operation. 

Examples

input

4
abab
aabb

output

2
3 3
3 2

input

Copy

1
a
b

output

-1

input

8
babbaabb
abababaa

output

3
2 6
1 3
7 8

解题思路:


比如下图这种情况,最佳的交换方式是一定的。所以只需要在第一个串中统计s[i]!=t[i]且s[i]='a'的位置,计数cnt1,每两个为一组按照下图的交换方式交换。同理也需要统计s[i]!=t[i]且s[i]='b'的位置,计数cnt2,处理方法同上。

注意:如cnt1和cnt2都为奇数的,那么处理完后会剩下下图这种情况,处理方法如下:

,交换方法:==》==》

如果cnt1 /cnt2中只有一个为奇数的话,无解。

 

ac代码:


 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
vector<int> a, b;//只记录s串中不对应的a和b的位置
char s[maxn],t[maxn];
int main()
{
    //freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
    int n;
    scanf("%d", &n);
    scanf("%s", s+1);
    scanf("%s", t+1);
    for(int i = 1; i <= n; i++)
    {
        if(s[i] != t[i])
        {
            if(s[i] == 'a') a.push_back(i);
            else b.push_back(i);
        }
    }
    if( (a.size() + b.size()) & 1)  puts("-1");
    else
    {
        int cnt = a.size() / 2 + b.size() / 2;
        if((a.size()&1) && (b.size()&1)) cnt += 2;
        printf("%d\n", cnt);
        for(int i = 0; i+1 < a.size(); i += 2)
            printf("%d %d\n", a[i], a[i+1]);
        for(int i = 0; i+1 < b.size(); i += 2)
            printf("%d %d\n", b[i], b[i+1]);
        if((a.size()&1) && (b.size()&1))
        {
            printf("%d %d\n", a[a.size()-1], a[a.size()-1]);
            printf("%d %d\n", a[a.size()-1], b[b.size()-1]);
        }
    }
}

 

全部评论

相关推荐

小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务