제출 #1088821

#제출 시각아이디문제언어결과실행 시간메모리
1088821juicyCubeword (CEOI19_cubeword)C++17
100 / 100
236 ms19796 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

const int M = 998244353, C = 62;

int cnt[C][C], f[C][C][C];

int conv(char c) {
  if ('a' <= c && c <= 'z') {
    return c - 'a';
  }
  if ('A' <= c && c <= 'Z') {
    return c - 'A' + 26;
  }
  return c - '0' + 52;
}

void add(int &x, int y) {
  if ((x += y) >= M) {
    x -= M;
  }
}

int solve(set<string> cnd) {
  memset(cnt, 0, sizeof(cnt));
  memset(f, 0, sizeof(f));
  for (auto s : cnd) {
    ++cnt[conv(s[0])][conv(s.back())];
  }
  for (int i = 0; i < C; ++i) {
    for (int j = i; j < C; ++j) {
      for (int k = j; k < C; ++k) {
        for (int l = 0; l < C; ++l) {
          add(f[i][j][k], (long long) cnt[i][l] * cnt[j][l] % M * cnt[k][l] % M);
        }
      }
    }
  }
  int res = 0;
  for (int i = 0; i < C; ++i) {
    for (int j = i; j < C; ++j) {
      for (int k = j; k < C; ++k) {
        for (int l = k; l < C; ++l) {
          int ways = (long long) f[i][j][k] * f[i][j][l] % M * f[i][k][l] % M * f[j][k][l] % M;
          if (i == l) {
            add(res, ways);
          } else if (i == k || j == l) {
            add(res, (long long) ways * 4 % M);
          } else if (i == j && l == k) {
            add(res, (long long) ways * 6 % M);
          } else if (i == j || j == k || k == l) {
            add(res, (long long) ways * 12 % M);
          } else {
            add(res, (long long) ways * 24 % M);
          }
        }
      }
    }
  }
  return res;
}

int main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);

  int n; cin >> n;
  array<set<string>, 10> buc;
  while (n--) {
    string s; cin >> s;
    int l = s.size() - 1;
    buc[l].insert(s);
    reverse(s.begin(), s.end());
    buc[l].insert(s);
  }
  int res = 0;
  for (int i = 2; i < 10; ++i) {
    add(res, solve(buc[i]));
  }
  cout << res;
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...