Dang_Quan_10_Tin

DuyenHai2020_PASSWORD

Aug 12th, 2021
885
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #define task "PASSWORD"
  5. using namespace std;
  6. using ll = long long;
  7. using ld = long double;
  8.  
  9. const int N = 1e5 + 3;
  10. const ll mod = 1e9 + 7;
  11. ll in[45], dp[N][35];
  12. string s, p, tmp;
  13. vector<int> v;
  14. int n, m;
  15.  
  16. ll stoi(int i, int j)
  17. {
  18.     ll ans = 0;
  19.     for (; i <= j; ++i)
  20.         ans = ans * 10 + tmp[i] - '0';
  21.     return ans;
  22. }
  23.  
  24. ll Pow(ll a, ll b)
  25. {
  26.     ll tmp = 1;
  27.     for (; b > 0; b >>= 1)
  28.     {
  29.         if (b & 1)
  30.             tmp = tmp * a % mod;
  31.         a = a * a % mod;
  32.     }
  33.     return tmp;
  34. }
  35.  
  36. void Convert()
  37. {
  38.     v.push_back(0);
  39.     for (int i = 0; i < tmp.size(); ++i)
  40.     {
  41.         if (tmp[i] >= 'a' && tmp[i] <= 'z')
  42.             s.push_back(tmp[i]);
  43.         else
  44.         {
  45.             int j = i;
  46.             while (j < tmp.size() && tmp[j] >= '0' && tmp[j] <= '9')
  47.                 ++j;
  48.             v.push_back(stoi(i, j - 1));
  49.             i = j - 1;
  50.         }
  51.     }
  52.     s = " " + s;
  53.     p = " " + p;
  54. }
  55.  
  56. void Read()
  57. {
  58.     cin >> n >> m >> tmp >> p;
  59.     Convert();
  60. }
  61.  
  62. void Add(ll &x, ll y)
  63. {
  64.     x += y;
  65.     if (x >= mod)
  66.         x -= mod;
  67. }
  68.  
  69. void Solve()
  70. {
  71.     for (int i = 1; i <= 40; ++i)
  72.         in[i] = Pow(i, mod - 2);
  73.     for (int i = 0; i < s.size(); ++i)
  74.         dp[i][0] = 1;
  75.     for (int i = 1; i < s.size(); ++i)
  76.         for (int j = 1; j < p.size(); ++j)
  77.         {
  78.             if (s[i] == p[j])
  79.             {
  80.                 ll now = 1;
  81.                 dp[i][j] = dp[i - 1][j];
  82.                 for (int t = 1; t <= v[i] && t <= j && p[j - t + 1] == p[j]; ++t)
  83.                 {
  84.                     now = now * (v[i] - t + 1) % mod * in[t] % mod;
  85.                     Add(dp[i][j], dp[i - 1][j - t] * now % mod);
  86.                 }
  87.             }
  88.             else
  89.                 dp[i][j] = dp[i - 1][j];
  90.             //cout << dp[i][j] << (j == p.size() - 1 ? "\n" : " ");
  91.         }
  92.     cout << (dp[s.size() - 1][p.size() - 1] % mod + mod) % mod;
  93. }
  94.  
  95. main()
  96. {
  97.     ios::sync_with_stdio(0);
  98.     cin.tie(0);
  99.     cout.tie(0);
  100.     if (fopen(task ".INP", "r"))
  101.         freopen(task ".INP", "r", stdin),
  102.             freopen(task ".OUT", "w", stdout);
  103.     Read();
  104.     Solve();
  105. }
Advertisement
Add Comment
Please, Sign In to add comment