제출 #246319

#제출 시각아이디문제언어결과실행 시간메모리
246319alradTrener (COCI20_trener)C++17
110 / 110
796 ms3576 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(x) x.begin(), x.end()

const long long P = 31;
const long long HashMod = 1e9 + 123;
const int MOD = 1e9 + 7;

int main() {
   #ifdef judge
      ifstream cin("input.txt");
   #endif // judge
   ios_base :: sync_with_stdio(0);
   cin.tie(0) , cout.tie(0);
   int n , k;
   cin >> n >> k;
   vector<long long> pow;
   pow.push_back(1LL);
   while ((int)pow.size() <= n) {
      pow.push_back(1LL * pow.back() * P % MOD);
   }
   auto getHash = [&](string s) {
      int res = 0;
      for (int i = 0; i < (int)s.size(); i++) {
         res += ((1LL * s[i] * pow[i]) % MOD);
         res %= MOD;
      }
      return res;
   };
   int full[n][k] , pref[n][k] , suf[n][k];
   for (int i = 0; i < n; i++) {
      for (int j = 0; j < k; j++) {
         string x;
         cin >> x;
         full[i][j] = getHash(x);
         if (i > 0) {
            pref[i][j] = getHash(x.substr(0 , i));
            suf[i][j] = getHash(x.substr(1 , i));
         }
      }
   }
   vector<vector<int> > dp(n , vector<int>(k , 0));
   for (int j = 0; j < k; j++) {
      dp[0][j] = 1;
   }
   for (int i = 1; i < n; i++) {
      for (int cur = 0; cur < k; cur++) {
         for (int prev = 0; prev < k; prev++) {
            if (full[i - 1][prev] == pref[i][cur] || full[i - 1][prev] == suf[i][cur]) {
               dp[i][cur] += dp[i - 1][prev];
               dp[i][cur] %= MOD;
            }
         }
      }
   }
   int ans = 0;
   for (int j = 0; j < k; j++) {
      ans += dp[n - 1][j];
      ans %= MOD;
   }
   cout << ans << '\n';
   return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...