Codeforces 1215C. Swap Letters

传送门

好像是个挺显然的贪心

首先每次交换当然要尽量一次交换就多两个相同的位置

优先把 $\begin{bmatrix}a\\ b\end{bmatrix}$ 和 $\begin{bmatrix}a\\ b\end{bmatrix}$ 交换

优先把 $\begin{bmatrix}b\\ a\end{bmatrix}$ 和 $\begin{bmatrix}b\\ a\end{bmatrix}$ 交换

最后如果剩下$\begin{bmatrix}a\\ b\end{bmatrix}$,$\begin{bmatrix}b\\ a\end{bmatrix}$ 各一个

我们才只好用两次交换次数把它们搞好,这样就是最优的了

当然如果最后某一种情况剩下一个,另一种情况却没了

那就无解了,具体维护看代码吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int N=4e5+7;
int n,pa,pb;
char A[N],B[N];
vector <int> ans[2];
int main()
{
    n=read(); scanf("%s",A+1); scanf("%s",B+1);
    for(int i=1;i<=n;i++)
    {
        if(A[i]==B[i]) continue;
        if(A[i]=='a')
        {
            if(!pa) pa=i;
            else ans[0].push_back(pa),ans[1].push_back(i),pa=0;
        }
        else
        {
            if(!pb) pb=i;
            else ans[0].push_back(pb),ans[1].push_back(i),pb=0;
        }
    }
    if((pa&&!pb)||(!pa&&pb)) { printf("-1\n"); return 0; }
    if(pa&&pb) { ans[0].push_back(pa); ans[1].push_back(pa); ans[0].push_back(pa); ans[1].push_back(pb); }
    int len=ans[0].size();
    printf("%d\n",len);
    for(int i=0;i<len;i++) printf("%d %d\n",ans[0][i],ans[1][i]);
    return 0;
}

 

posted @ 2019-09-17 11:05  LLTYYC  阅读(380)  评论(0编辑  收藏  举报