fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int main() {
  5. ios::sync_with_stdio(false);
  6. cin.tie(nullptr);
  7.  
  8. int N;
  9. cin >> N;
  10. string SS, SK, SH;
  11. cin >> SS >> SK >> SH;
  12.  
  13. string ans = SS; // 기본적으로 숭돌이 답으로 채움
  14. int scoreS=0, scoreK=0, scoreH=0;
  15.  
  16. auto recompute = [&](string &A){
  17. int s=0,k=0,h=0;
  18. for(int i=0;i<N;i++){
  19. if(A[i]==SS[i]) s++;
  20. if(A[i]==SK[i]) k++;
  21. if(A[i]==SH[i]) h++;
  22. }
  23. return tuple<int,int,int>(s,k,h);
  24. };
  25.  
  26. tie(scoreS,scoreK,scoreH) = recompute(ans);
  27.  
  28. // 첫 패스: 셋 다 같으면 전부 틀리게
  29. for(int i=0;i<N;i++){
  30. if(SS[i]==SK[i] && SK[i]==SH[i]){
  31. char c = 'a';
  32. if(c==SS[i]) c='b';
  33. ans[i]=c;
  34. }
  35. }
  36. tie(scoreS,scoreK,scoreH) = recompute(ans);
  37.  
  38. // 조정: scoreS > scoreK > scoreH 만들어야 함
  39. // 반복적으로 시도
  40. bool changed=true;
  41. while(!(scoreS>scoreK && scoreK>scoreH) && changed){
  42. changed=false;
  43. for(int i=0;i<N;i++){
  44. int oldS=(ans[i]==SS[i]);
  45. int oldK=(ans[i]==SK[i]);
  46. int oldH=(ans[i]==SH[i]);
  47. for(char c : {SS[i],SK[i],SH[i],'a'}){
  48. if(c==ans[i]) continue;
  49. int newS=scoreS-oldS+(c==SS[i]);
  50. int newK=scoreK-oldK+(c==SK[i]);
  51. int newH=scoreH-oldH+(c==SH[i]);
  52. if(newS>newK && newK>newH){
  53. ans[i]=c;
  54. scoreS=newS; scoreK=newK; scoreH=newH;
  55. changed=true;
  56. break;
  57. }
  58. }
  59. if(changed) break;
  60. }
  61. }
  62.  
  63. if(scoreS>scoreK && scoreK>scoreH){
  64. cout<<ans<<"\n";
  65. } else {
  66. cout<<-1<<"\n";
  67. }
  68. }
Success #stdin #stdout 0.01s 5292KB
stdin
5
abcde
efgtb
abgte
stdout
-1