Advertisement
rembocoder

Untitled

Mar 20th, 2023
656
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define int int64_t
  6.  
  7. const int inf = 2e18;
  8.  
  9. int32_t main() {
  10.     ios_base::sync_with_stdio(0);
  11.     cin.tie(0); cout.tie(0);
  12.     int l, r, n;
  13.     cin >> l >> r >> n;
  14.     l--;
  15.     vector<char> from(n);
  16.     vector<string> to(n);
  17.     for (int i = 0; i < n; i++) {
  18.         cin >> from[i] >> to[i];
  19.         from[i] -= 'a';
  20.         for (int j = 0; j < to[i].size(); j++) {
  21.             to[i][j] -= 'a';
  22.         }
  23.     }
  24.     vector<vector<int>> sz(n + 1, vector<int>(26, 1));
  25.     for (int i = n - 1; i >= 0; i--) {
  26.         sz[i] = sz[i + 1];
  27.         sz[i][from[i]] = 0;
  28.         for (char c: to[i]) {
  29.             sz[i][from[i]] += sz[i + 1][c];
  30.             sz[i][from[i]] = min(sz[i][from[i]], inf);
  31.         }
  32.     }
  33.     vector<int> fr(26);
  34.     string s(1, 0);
  35.     for (int i = 0; i < n; i++) {
  36.         vector<int> new_fr(26);
  37.         for (int j = 0; j < 26; j++) {
  38.             if (j != from[i]) {
  39.                 new_fr[j] += fr[j];
  40.             } else {
  41.                 for (char c: to[i]) {
  42.                     new_fr[c] += fr[j];
  43.                 }
  44.             }
  45.         }
  46.         fr = new_fr;
  47.         string new_s;
  48.         for (char c: s) {
  49.             if (c != from[i]) {
  50.                 new_s.push_back(c);
  51.             } else {
  52.                 for (char c2: to[i]) {
  53.                     new_s.push_back(c2);
  54.                 }
  55.             }
  56.         }
  57.         int fin_sz = 0;
  58.         for (int j = 0; j < 26; j++) {
  59.             fin_sz += fr[j] * sz[i + 1][j];
  60.         }
  61.         s = "";
  62.         for (char c: new_s) {
  63.             fin_sz += sz[i + 1][c];
  64.             if (fin_sz <= l) {
  65.                 fr[c]++;
  66.                 continue;
  67.             }
  68.             s.push_back(c);
  69.             if (fin_sz >= r) {
  70.                 break;
  71.             }
  72.         }
  73.     }
  74.     for (int i = 0; i < s.size(); i++) {
  75.         s[i] += 'a';
  76.     }
  77.     cout << s << endl;
  78. }
  79.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement