Advertisement
a53

vip

a53
May 8th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4.  
  5. #define NMAX 100005
  6. #define sigma 26
  7.  
  8. char s1[NMAX], s2[NMAX];
  9. int sir1[NMAX], sir2[NMAX], t, n, k;
  10. int freq1[NMAX], freq2[NMAX], answer[NMAX];
  11.  
  12. void readInput() {
  13. scanf("%d %d\n", &n, &k);
  14. scanf("%s", s1 + 1);
  15. scanf("%s", s2 + 1);
  16. for(int i = 1; i <= n; i++) {
  17. sir1[i] = s1[i] - 'a' + 1;
  18. sir2[i] = s2[i] - 'a' + 1;
  19. freq1[sir1[i]]++;
  20. freq2[sir2[i]]++;
  21. }
  22. }
  23.  
  24. bool checkInvariant(int equals, int different) {
  25. if(equals < 0 || different < 0)
  26. return false;
  27. int need_extra_op = 0, max_extra = 0;
  28. for(int i = 1; i <= sigma; i++) {
  29. int extra_car = freq1[i] + freq2[i] - different;
  30. int extra_op = (extra_car + 1) / 2;
  31. if(extra_op > min(freq1[i], freq2[i]))
  32. return false;
  33. max_extra += min(freq1[i], freq2[i]);
  34. if(extra_op > 0)
  35. need_extra_op += extra_op;
  36. }
  37. return need_extra_op <= equals && equals <= max_extra;
  38. }
  39.  
  40. bool solveProblem() {
  41. int equals = n - k;
  42. int different = k;
  43. if(!checkInvariant(equals, different)) {
  44. return false;
  45. }
  46. for(int i = 1; i <= n; i++) {
  47. freq1[sir1[i]]--;
  48. for(int j = 1; j <= sigma; j++) {
  49. if(!freq2[j])
  50. continue;
  51. freq2[j]--;
  52. if(sir1[i] == j) {
  53. equals--;
  54. }
  55. else {
  56. different--;
  57. }
  58.  
  59. if(checkInvariant(equals, different)) {
  60. answer[i] = j;
  61. break;
  62. }
  63. if(sir1[i] == j) {
  64. equals++;
  65. }
  66. else {
  67. different++;
  68. }
  69.  
  70. freq2[j]++;
  71. }
  72. }
  73. return true;
  74. }
  75.  
  76. void writeOutput(bool verdict) {
  77. if(!verdict) {
  78. printf("-1\n");
  79. return ;
  80. }
  81. for(int i = 1; i <= n; i++) {
  82. printf("%c", 'a' + answer[i] - 1);
  83. }
  84. printf("\n");
  85. }
  86.  
  87. void clearAll() {
  88. for(int i = 1; i <= sigma; i++) {
  89. freq1[i] = freq2[i] = 0;
  90. }
  91.  
  92. }
  93.  
  94. int main () {
  95. freopen("vip.in","r",stdin);
  96. freopen("vip.out","w",stdout);
  97.  
  98. scanf("%d", &t);
  99. for(int i = 1; i <= t; i++) {
  100. readInput();
  101. bool ok = solveProblem();
  102. writeOutput(ok);
  103. clearAll();
  104. }
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement