CF #324 DIV2 C题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX=1e5+7; char s1[MAX],s2[MAX],s3[MAX]; char getdif( char a, char b){ for ( int i=0;i<26;i++) if ( 'a' +i!=a&& 'a' +i!=b) return 'a' +i; } ///考虑的方式时,假设当前字符串与A字符串相同,则不同的贡献值为(0,1),如果与B相同,则贡献值为(1,0),否则为(1,1) int main(){ int n,t,cnt; while ( scanf ( "%d%d" ,&n,&t)!=EOF){ scanf ( "%s%s" ,s1+1,s2+1); cnt=0; for ( int i=1;i<=n;i++) if (s1[i]!=s2[i]) cnt++; if (t>n||cnt>2*t){ ///可以发现,这两种情况是无解的 puts ( "-1" ); continue ; } int a,b; if (cnt<=t) a=b=cnt; ///当不同的个数少于等于要求的个数时,直接让a=b=cnt; else a=b=cnt/2+cnt%2; ////如果在于,则可以把cnt先平分,剩下看奇偶 int lcnt=t-a; ////看还差多少个可以满足,这时考虑(1,1)的方法 if (n-cnt<lcnt){ ///如果相同的个数<差的个数 lcnt+=lcnt-(n-cnt); ///则需要从不同的个数里把原来只考虑(1,0)或(0,1)的情况改成(1,1) cnt-=lcnt-(n-cnt); ///从原来减去 a=b=cnt/2+cnt%2; ///更改a,b } for ( int i=1;i<=n;i++){ if (s1[i]==s2[i]){ if (lcnt) s3[i]=getdif(s1[i],s2[i]),lcnt--; else s3[i]=s1[i]; } } for ( int i=1;i<=n;i++){ if (s1[i]!=s2[i]){ if (lcnt){ s3[i]=getdif(s1[i],s2[i]),lcnt--; cnt--; continue ; } if (cnt==a&&a==b) s3[i]=getdif(s1[i],s2[i]), cnt--,a--,b--; else { if (a>b) s3[i]=s1[i],a--; else s3[i]=s2[i],b--; cnt--; } } } for ( int i=1;i<=n;i++) printf ( "%c" ,s3[i]); printf ( "\n" ); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步