Advertisement
Guest User

Untitled

a guest
Jan 21st, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. fstream f("date.in");
  8. char primul[200], doilea[200];
  9. int s[200], maxim[200], n, marime, sol;
  10.  
  11. void delimitare()
  12. {
  13. char i1[200], i2[200];
  14. int n1[10], n2[10], i, j;
  15. f.getline(i1, 200, '\n');
  16. f.getline(i2, 200, '\0');
  17.  
  18. i = 0;
  19.  
  20. for (i = 0; i <= 9; i++)
  21. {
  22. n1[i] = 0;
  23. n2[i] = 0;
  24. }
  25.  
  26. i = 0;
  27. while (i1[i] != '\0')
  28. {
  29. n1[i1[i] - '0'] = 1;
  30. i++;
  31. }
  32.  
  33. i = 0;
  34. while (i2[i] != '\0')
  35. {
  36. n2[i2[i] - '0'] = 1;
  37. i++;
  38. }
  39.  
  40. i = 0;
  41. j = 0;
  42. while (i1[i] != '\0')
  43. {
  44. if (n2[i1[i] - '0'] == 1 && n1[i1[i] - '0'] == 1)
  45. {
  46. primul[j] = i1[i];
  47. j++;
  48. }
  49. i++;
  50. }
  51. primul[j] = '\0';
  52.  
  53. i = 0;
  54. j = 0;
  55. while (i2[i] != '\0')
  56. {
  57. if (n2[i2[i] - '0'] == 1 && n1[i2[i] - '0'] == 1)
  58. {
  59. doilea[j] = i2[i];
  60. j++;
  61. }
  62. i++;
  63. }
  64. doilea[j] = '\0';
  65. }
  66.  
  67. void init(int k)
  68. {
  69. if (k == 0)
  70. s[k] = -1;
  71. else
  72. s[k] = s[k - 1];
  73. }
  74.  
  75. int next(int k)
  76. {
  77. if (s[k] < int(strlen(primul) - 1))
  78. {
  79. s[k]++;
  80. return (1);
  81. }
  82. else
  83. return (0);
  84. }
  85.  
  86. int valid(int k)
  87. {
  88. int i, j;
  89. i = 0;
  90. j = 0;
  91. while (i <= k && doilea[j] != '\0')
  92. {
  93. while (doilea[j] != primul[s[i]] && doilea[j] != '\0')
  94. j++;
  95. i++;
  96. }
  97. if (i != (k + 1))
  98. return (0);
  99. else
  100. return (1);
  101.  
  102. }
  103.  
  104. int solutie(int k)
  105. {
  106. return k == (marime - 1);
  107. }
  108.  
  109. void afisare(int k)
  110. {
  111. for (int i = 0; i <= k; i++)
  112. cout << primul[maxim[i]];
  113. cout << endl;
  114. }
  115.  
  116. int comparatie(int maxim[200], int s[200], int k)
  117. {
  118. int i;
  119.  
  120. i = 0;
  121. while (maxim[i] == s[i] && k < strlen(primul))
  122. i++;
  123. if (primul[s[i]] > primul[maxim[i]])
  124. return (1);
  125. return (0);
  126. }
  127.  
  128. void depunere(int k)
  129. {
  130. if (sol == 0)
  131. for (int i = 0; i <= k; i++)
  132. maxim[i] = s[i];
  133. else
  134. if (comparatie(maxim, s, k))
  135. for (int i = 0; i <= k; i++)
  136. maxim[i] = s[i];
  137. sol = 1;
  138. }
  139.  
  140. void bt()
  141. {
  142. int k = 0;
  143.  
  144. init(k);
  145. while (k >= 0)
  146. {
  147. if (next(k))
  148. {
  149. if (valid(k))
  150. {
  151. if (solutie(k))
  152. depunere(k);
  153. else
  154. {
  155. k++;
  156. init(k);
  157. }
  158. }
  159. }
  160. else k--;
  161. }
  162. }
  163.  
  164. void interschimb()
  165. {
  166. int marime_1 = strlen(primul);
  167. int marime_2 = strlen(doilea);
  168. char inter[200];
  169. for (int i = 0; i <= marime_1; i++)
  170. inter[i] = primul[i];
  171. for (int i = 0; i <= marime_2; i++)
  172. primul[i] = doilea[i];
  173. for (int i = 0; i <= marime_1; i++)
  174. doilea[i] = inter[i];
  175. }
  176.  
  177. int main()
  178. {
  179. delimitare();
  180. sol = 0;
  181.  
  182. if (strlen(primul) > strlen(doilea))
  183. interschimb();
  184.  
  185. if (strlen(primul) == 0 || strlen(doilea) == 0)
  186. cout << "0";
  187. else
  188. for (int i = strlen(primul); i > 0 && sol == 0; i--)
  189. {
  190. marime = i;
  191. bt();
  192. }
  193. afisare(marime - 1);
  194. return 0;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement