Advertisement
Josif_tepe

Untitled

Feb 22nd, 2024
1,055
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 555;
  6. string add_two_numbers(string a, string b) {
  7.     if(a.size() < b.size()) {
  8.         swap(a, b);
  9.     }
  10.     int carry = 0;
  11.     string res = "";
  12.     int i = (int) a.size() - 1, j = (int) b.size() - 1;
  13.     while(j >= 0 and i >= 0) {
  14.         int digit_a = (int) (a[i] - '0');
  15.         int digit_b = (int) (b[j] - '0');
  16.         int sum = digit_a + digit_b + carry;
  17.         if(sum < 10) {
  18.             carry = 0;
  19.         }
  20.         else {
  21.             carry = 1;
  22.             sum -= 10;
  23.         }
  24.         res += (sum + '0');
  25.         i--;
  26.         j--;
  27.     }
  28.     while(i >= 0) {
  29.         int digit_a = (int) (a[i] - '0');
  30.         int sum = digit_a + carry;
  31.         if(sum < 10) {
  32.             carry = 0;
  33.         }
  34.         else {
  35.             carry = 1;
  36.             sum -= 10;
  37.         }
  38.         res += (sum + '0');
  39.         i--;
  40.     }
  41.     if(carry == 1) {
  42.         res += "1";
  43.     }
  44.     reverse(res.begin(), res.end());
  45.     return res;
  46. }
  47. string multiply_two_numbers(string a, string b) {
  48.     vector<int> v((int) a.size() + (int) b.size(), 0);
  49.     int sz_a = (int) a.size();
  50.     int sz_b = (int) b.size();
  51.     for(int i = sz_a - 1; i >= 0; i--) {
  52.         for(int j = sz_b - 1; j >= 0; j--) {
  53.             v[i + j + 1] += (a[i] - '0') * (b[j] - '0');
  54.            
  55.         }
  56.     }
  57.     for(int i = sz_a + sz_b - 1; i >= 0; i--) {
  58.         if(v[i] >= 10) {
  59.             v[i - 1] += v[i] / 10;
  60.             v[i] %= 10;
  61.         }
  62.     }
  63.     string res = "";
  64.     int i = 0;
  65.     while(v[i] == 0) {
  66.         i++;
  67.     }
  68.     while(i < sz_a + sz_b) {
  69.         res += (v[i] + '0');
  70.         i++;
  71.     }
  72.    
  73.     return res;
  74. }
  75. string power(string a, int k) {
  76.     string res = "1";
  77.     while(k--) {
  78.         res = multiply_two_numbers(res, a);
  79.     }
  80.     return res;
  81. }
  82. bool compare(string a, string b) {
  83.     if(a.size() < b.size()) {
  84.         return true;
  85.     }
  86.     if(a.size() > b.size()) {
  87.         return false;
  88.     }
  89.     if(a == b) {
  90.         return true;
  91.     }
  92.     if(a < b) {
  93.         return true;
  94.     }
  95.     return false;
  96. }
  97. string to_str(int number) {
  98.     string res = "";
  99.     while(number) {
  100.         int digit = number % 10;
  101.         res += (digit + '0');
  102.         number /= 10;
  103.     }
  104.     reverse(res.begin(), res.end());
  105.     return res;
  106. }
  107. int n, m, k, x;
  108. string words[maxn];
  109. int main() {
  110.     ios_base::sync_with_stdio(false);
  111.     cin >> n >> m >> k >> x;
  112.     string s;
  113.     cin >> s;
  114.     string X = to_str(x);
  115.     string K = to_str(k);
  116.     for(int i = 0; i < m; i++) {
  117.         cin >> words[i];
  118.         sort(words[i].begin(), words[i].end());
  119.     }
  120.     vector<string> pows;
  121.     pows.push_back("1");
  122.     string current_power = "1";
  123.     for(int i = 0; i < m; i++) {
  124.         current_power = multiply_two_numbers(current_power, K);
  125.         pows.push_back(current_power);
  126.     }
  127.     current_power = pows[(int) pows.size() - 2];
  128.     string tmp = "1";
  129.     int at = 0;
  130.     vector<char> res;
  131.     while(compare(add_two_numbers(tmp, current_power), X)) {
  132.         tmp = add_two_numbers(tmp, current_power);
  133.         at++;
  134.     }
  135.     res.push_back(words[0][at]);
  136.     int idx = (int) pows.size() - 3;
  137.     int i = 1;
  138.     while(idx >= 0) {
  139.         at = 0;
  140.         while(compare(add_two_numbers(tmp, pows[idx]), X)) {
  141.             tmp = add_two_numbers(tmp, pows[idx]);
  142.             at++;
  143.         }
  144.         res.push_back(words[i][at]);
  145.         i++;
  146.         idx--;
  147.     }
  148.     int o = 0;
  149.     for(int i = 0; i < n; i++) {
  150.         if(s[i] == '#') {
  151.             s[i] = res[o++];
  152.         }
  153.         cout << s[i];
  154.     }
  155.    
  156.  
  157.  
  158.     return 0;
  159. }
  160.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement