Submission #846016

#TimeUsernameProblemLanguageResultExecution timeMemory
846016MKutayBozkurtTrener (COCI20_trener)C++17
110 / 110
143 ms13216 KiB
/**
 *  author: kututay
 *  created: 06.09.2023 16:41:38
**/
#include <bits/stdc++.h>
using namespace std;

#ifdef DEBUG
  #include "/Users/kutay/CP/templates/debug.h"
#else
  #define debug(...) void(38)
#endif

#define int long long

const int mod = 1e9 + 7;

int32_t main() {
  ios_base::sync_with_stdio(0); cin.tie(0);
  int n, k; cin >> n >> k;
  vector<vector<int>> a(n * k + 2);
  vector<int> dp(n * k + 2, -1), cnt(n * k + 2);

  function<int(int)> f = [&](int node) {
    if (dp[node] != -1) return dp[node];
    int res = 0;
    sort(a[node].begin(), a[node].end());
    for (int i = 0; i < (int) a[node].size(); i++) {
      int next = a[node][i];
      if (i > 0 && a[node][i - 1] == next) continue;
      res += (cnt[node] * f(next)) % mod;
      res %= mod;
    }
    return dp[node] = res;
  };

  map<string, int> m;
  int count = 0;

  for (int i = 0; i < n; i++) {
    for (int j = 0; j < k; j++) {
      string s; cin >> s;
      if (m.count(s) == 0) {
        m[s] = ++count;
      }
      int node = m[s];
      cnt[node]++;
      if (i == n - 1) dp[node] = cnt[node];
      if (i > 0) {
        if (m.count(s.substr(0, i))) a[m[s.substr(0, i)]].emplace_back(node);
        if (m.count(s.substr(1, i))) a[m[s.substr(1, i)]].emplace_back(node);
      } else {
        if (cnt[node] == 1) {
          a[n * k + 1].emplace_back(node);
        }
      }
    }
  }
  cnt[n * k + 1] = 1;
  cout << f(n * k + 1) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...