好像是个挺显然的贪心
首先每次交换当然要尽量一次交换就多两个相同的位置
即
优先把 $egin{bmatrix}a\ bend{bmatrix}$ 和 $egin{bmatrix}a\ bend{bmatrix}$ 交换
优先把 $egin{bmatrix}b\ aend{bmatrix}$ 和 $egin{bmatrix}b\ aend{bmatrix}$ 交换
最后如果剩下$egin{bmatrix}a\ bend{bmatrix}$,$egin{bmatrix}b\ aend{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 "); 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 ",len); for(int i=0;i<len;i++) printf("%d %d ",ans[0][i],ans[1][i]); return 0; }