제출 #949440

#제출 시각아이디문제언어결과실행 시간메모리
949440gaga999Cubeword (CEOI19_cubeword)C++17
100 / 100
1073 ms15480 KiB
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5, mod = 998244353; int n, ans; int cnt[11]; int v[11][63][63]; int f[11][63][63][63]; int tran(char c) { if (c >= 'a' && c <= 'z') return c - 96; else if (c >= 'A' && c <= 'Z') return c - 38; else if (c >= '0' && c <= '9') return c + 5; else return 0; } string s[maxn]; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i]; s[i + n] = s[i]; reverse(s[i + n].begin(), s[i + n].end()); } n *= 2; sort(s + 1, s + 1 + n); n = unique(s + 1, s + n + 1) - s - 1;//去重 for (int i = 1; i <= n; i++) { cnt[s[i].size()]++; v[s[i].size()][tran(s[i][0])][tran(s[i][s[i].size() - 1])]++; } for (int len = 3; len <= 10; len++) { if (!cnt[len]) continue; for (int l = 1; l <= 62; l++) { for (int i = 1; i <= 62; i++) { if (!v[len][l][i]) continue; for (int j = 1; j <= 62; j++) { if (!v[len][l][j]) continue; for (int k = 1; k <= 62; k++) { if (!v[len][l][k]) continue; (f[len][i][j][k] += 1ll * v[len][l][i] * v[len][l][j] % mod * v[len][l][k] % mod) %= mod; } } } } for (int l = 1; l <= 62; l++) { for (int i = 1; i <= 62; i++) { for (int j = 1; j <= 62; j++) { for (int k = 1; k <= 62; k++) { (ans += 1ll * f[len][i][j][k] * f[len][i][j][l] % mod * f[len][i][k][l] % mod * f[len][j][k][l] % mod) %= mod; } } } } } cout << ans; 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...