Submission #845168

#TimeUsernameProblemLanguageResultExecution timeMemory
845168vjudge1Trener (COCI20_trener)C++17
110 / 110
62 ms5720 KiB
// author: erray
#include <bits/stdc++.h>

#ifdef DEBUG
  #include "debug.h"
#else
  #define debug(...) void(37)
#endif

using namespace std;

constexpr int md = int(1e9) + 7;
int add(int x, int y) {
  if ((x += y) >= md) {
    x -= md;
  }
  return x;
}
int mul(int x, int y) {
  return 1LL * x * y % md;
}
constexpr int base = 31;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  array<int, 26> hv{};
  iota(hv.begin(), hv.end(), 0);
  random_shuffle(hv.begin(), hv.end());
  int N, K;
  cin >> N >> K;
  vector<vector<string>> S(N, vector<string>(K));
  for (int i = 0; i < N; ++i) {
    for (int j = 0; j < K; ++j) {
      cin >> S[i][j];
    }
  }
  map<int, int> ans;
  for (int i = 0; i < N; ++i) {
    map<int, int> next_ans;
    for (int j = 0; j < K; ++j) {
      int h = 0, L = -1;
      for (int k = 0; k <= i; ++k) {
        h = mul(h, base);
        h = add(h, hv[S[i][j][k] - 'a']);  
        if (k == i - 1) {
          L = h;
        }
      }
      int R = 0;
      for (int k = 1; k <= i; ++k) {
        R = mul(R, base);
        R = add(R, hv[S[i][j][k] - 'a']);
      }
      int res = (i == 0);
      res = add(res, ans[L]);
      if (R != L) {
        res = add(res, ans[R]);
      }
      next_ans[h] = add(next_ans[h], res);
    } 
    swap(ans, next_ans);
  } 
  int p = 0;
  for (auto[foo, x] : ans) {
    p = add(p, x);
  }
  cout << p << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...