Advertisement
libobil

Untitled

May 17th, 2023
530
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. const int MAXN = 5e4 + 10;
  4. const int MAXM = 51;
  5. const int MOD = 1e9 + 7;
  6.  
  7. string dict[MAXM];
  8. bool censured[MAXM][MAXM];
  9. int selfix[MAXN][MAXM];
  10. bool word[MAXN][MAXM];
  11. long long ans[MAXM];
  12. long long dplr[MAXN][MAXM], dprl[MAXN][MAXM];
  13.  
  14. int main() {
  15.     ios_base::sync_with_stdio(false);
  16.     cin.tie(0);
  17.     cout.tie(0);
  18.  
  19.     int n, m, k;
  20.     cin >> n >> m >> k;
  21.     string v;
  22.     cin >> v;
  23.     for (int i = 1; i <= m; i++) {
  24.         cin >> dict[i];
  25.  
  26.         selfix[0][i] = 0;
  27.         for (int j = 1; j < dict[i].size(); j++) {
  28.             int curr = selfix[j - 1][i] + 1;
  29.             while (dict[i][curr - 1] != dict[i][j]) {
  30.                 if (curr <= 1) {
  31.                     curr = 0;
  32.                     break;
  33.                 }
  34.                 curr = selfix[curr - 2][i] + 1;
  35.             }
  36.             selfix[j][i] = curr;
  37.         }
  38.  
  39.         int curr = 0;
  40.         for (int j = 0; j < n; j++) {
  41.             while (v[j] != dict[i][curr]) {
  42.                 if (curr <= 0) {
  43.                     curr = -1;
  44.                     break;
  45.                 }
  46.                 curr = selfix[curr - 1][i];
  47.             }
  48.             curr++;
  49.             if (curr == dict[i].size()) {
  50.                 word[j - curr + 1][i] = true;
  51. //                cout << j - curr + 1 << '\n';
  52.                 curr = selfix[curr - 1][i];
  53.             }
  54.         }
  55.  
  56.     }
  57.     for (int i = 0; i < k; i++) {
  58.         int a, b;
  59.         cin >> a >> b;
  60.         censured[a][b] = true;
  61.     }
  62.  
  63.     for (int i = 1; i <= m; i++) {
  64.         if (word[0][i]) {
  65.             dplr[dict[i].size()][i]++;
  66.         }
  67.     }
  68.     for (int j = 1; j < n; j++) {
  69.         for (int i = 1; i <= m; i++) {
  70.             for (int h = 1; h <= m; h++) {
  71.                 if (!censured[i][h] && word[j][h] && j + dict[h].size() <= n) {
  72.                     dplr[j + dict[h].size()][h] += dplr[j][i];
  73.                     if (dplr[j + dict[h].size()][h] >= MOD) dplr[j + dict[h].size()][h] -= MOD;
  74.                 }
  75.             }
  76.         }
  77.     }
  78.  
  79.     for (int i = 1; i <= m; i++) {
  80.         if (word[n - dict[i].size()][i]) {
  81.             dprl[n - dict[i].size()][i]++;
  82.         }
  83.     }
  84.     for (int j = n - 1; j >= 0; j--) {
  85.         for (int i = 1; i <= m; i++) {
  86.             for (int h = 1; h <= m; h++) {
  87.                 if (!censured[i][h] && j >= dict[i].size() && word[j - dict[i].size()][i]) {
  88.                     dprl[j - dict[i].size()][i] += dprl[j][h];
  89.                     if (dprl[j - dict[i].size()][i] >= MOD) dprl[j - dict[i].size()][i] -= MOD;
  90.                 }
  91.             }
  92.         }
  93.     }
  94.  
  95.     for (int j = 0; j < n; j++) {
  96.         for (int i = 1; i <= m; i++) {
  97.             if (word[j][i]) {
  98.                 long long suml = 0, sumr = 0;
  99.                 for (int h = 1; h <= m; h++) {
  100.                     if (!censured[h][i] && j - 1 >= 0) {
  101.                         suml += dplr[j][h];
  102.                         if (suml >= MOD) suml -= MOD;
  103.                     }
  104.                     if (!censured[i][h] && j + dict[i].size() < n) {
  105.                         sumr += dprl[j + dict[i].size()][h];
  106.                         if (sumr >= MOD) sumr -= MOD;
  107.                     }
  108.                 }
  109.                 if (j == 0) {
  110.                     ans[i] += sumr;
  111.                     if (ans[i] >= MOD) ans[i] -= MOD;
  112.                 } else if (j + dict[i].size() == n) {
  113.                     ans[i] += suml;
  114.                     if (ans[i] >= MOD) ans[i] -= MOD;
  115.                 } else {
  116.                     ans[i] += suml * sumr % MOD;
  117.                     if (ans[i] >= MOD) ans[i] -= MOD;
  118.                 }
  119.             }
  120.         }
  121.     }
  122.  
  123.     for (int i = 1; i <= m; i++) {
  124.         cout << ans[i] << '\n';
  125.     }
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement