CGATA
ATAGC
2
这个题就是问你从上面的串变成下面的串,最少操作几次(调换两个)
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<map> using namespace std; typedef long long ll; const int maxn=1e6+100; char a[maxn],b[maxn]; int c[1000][1000]; map<char,int>mp; int main(){ mp[‘A‘]=0; mp[‘T‘]=1; mp[‘C‘]=2; mp[‘G‘]=3; scanf("%s",a); scanf("%s",b); int len=strlen(a); for(int i=0;i<len;i++){ if(a[i]!=b[i]) c[mp[a[i]]][mp[b[i]]]++; } int ans=0; for(int i=0;i<=3;i++){ for(int j=i;j<=3;j++){ int t=min(c[i][j],c[j][i]); c[i][j]-=t; c[j][i]-=t; ans+=t; } } for(int i=0;i<=3;i++){ for(int j=0;j<=3;j++){ for(int k=0;k<=3;k++){ int z=min(c[i][j],min(c[j][k],c[k][i])); c[i][j]-=z; c[j][k]-=z; c[k][i]-=z; ans+=2*z; } } } for(int i=0;i<=3;i++){ for(int j=0;j<=3;j++){ for(int k=0;k<=3;k++){ for(int z=0;z<=3;z++){ int p=min(c[i][j],min(c[j][z],min(c[z][k],c[k][i]))); c[i][j]-=p; c[j][z]-=p; c[z][k]-=p; c[k][i]-=p; ans+=3*p; } } } } cout<<ans<<endl; }
原文:https://www.cnblogs.com/lipu123/p/14728100.html