Advertisement
Guest User

Untitled

a guest
Apr 13th, 2021
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.95 KB | None | 0 0
  1. // Marcin Knapik
  2. #pragma GCC optimize("O3")
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5.  
  6. #define sz(x) ((int)(x).size())
  7. #define pb push_back
  8. #define all(s) s.begin(), s.end()
  9. #define f first
  10. #define s second
  11.  
  12. const int N = 1e6 + 6;
  13. const int mod = 998244353;
  14.  
  15. #define vi vector<int>
  16. #define vvi vector<vi>
  17.  
  18. int f(int a, int b, int c){
  19. return a * 40 + b * 8 + (a == b ? 0 : c);
  20. }
  21.  
  22. vvi operator * (vvi & a, vvi & b){
  23. int n = sz(a);
  24. assert(sz(a) and sz(b));
  25. assert(sz(a) == sz(a[0]) and sz(a[0]) == sz(b) and sz(b) == sz(b[0]));
  26. vvi ret(n, vi(n, 0));
  27. for(int i = 0; i < n; i++)
  28. for(int j = 0; j < n; j++)
  29. for(int k = 0; k < n; k++)
  30. ret[i][j] = (ret[i][j] + 1ll * a[i][k] * b[k][j]) % mod;
  31. return ret;
  32. }
  33.  
  34. vvi fast(vvi a, int b){
  35. vvi ret = a;
  36. for(int i = 0; i < sz(ret); i++)
  37. for(int j = 0; j < sz(ret); j++)
  38. ret[i][j] = (i == j);
  39.  
  40. while(b){
  41. if(b & 1)
  42. ret = ret * a;
  43. a = a * a;
  44. b /= 2;
  45. }
  46.  
  47. return ret;
  48. }
  49.  
  50. void solve(){
  51. int n, m;
  52. cin >> n >> m;
  53. vector<string> tab(n);
  54.  
  55. for(int i = 0; i < n; i++)
  56. cin >> tab[i];
  57.  
  58. vvi row(5 * 5 * 8, vi(5 * 5 * 8));
  59. row[0][f(0, 0, 0)] = 1;
  60.  
  61. vvi mat(5 * 5 * 8, vi(5 * 5 * 8));
  62.  
  63. for(int i = 1; i <= 4; i++)
  64. for(int j = 1; j <= 4; j++)
  65. for(int k = 0; k < n; k++)
  66. mat[f(i, j, k)][f(i - 1, j - 1, k)] = 1;
  67.  
  68. for(int i = 0; i <= 4; i++)
  69. for(int j = 0; j <= 4; j++)
  70. for(int k = 0; k < n; k++){
  71. if(i == 0 and j == 0 and k == 0)
  72. for(int a = 0; a < n; a++)
  73. for(int b = 0; b < n; b++){
  74. int dl = min(sz(tab[a]), sz(tab[b]));
  75. if(tab[a].substr(0, dl) == tab[b].substr(0, dl))
  76. mat[f(0, 0, 0)][f(sz(tab[a]) - 1, sz(tab[b]) - 1,
  77. (sz(tab[a]) > sz(tab[b]) ? a : b))] += 1;
  78. }
  79. else if(i != j and min(i, j) == 0)
  80. for(int a = 0; a < n; a++){
  81. int dl = min(abs(i - j), sz(tab[a]));
  82.  
  83. if(sz(tab[k]) - abs(i - j) < 0)
  84. continue;
  85. if(tab[a].substr(0, dl) ==
  86. tab[k].substr(sz(tab[k]) - abs(i - j), dl))
  87. mat[f(i, j, k)]
  88. [f(i - 1 + (i < j) * sz(tab[a]), j - 1 + (j < i) * sz(tab[a]),
  89. (abs(i - j) > dl ? k : a))] += 1;
  90. }
  91. }
  92.  
  93. vvi pot = fast(mat, m);
  94. vvi ret = row * pot;
  95.  
  96. cout << ret[0][f(0, 0, 0)] << '\n';
  97. }
  98.  
  99. int main() {
  100. ios::sync_with_stdio(0);
  101. cin.tie(0);
  102.  
  103. int tt = 1;
  104. // cin >> tt;
  105.  
  106. for(int i = 0; i < tt; i++)
  107. solve();
  108. }
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement