#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("unroll-loops")
typedef long long ll;
constexpr int MAX = 62, MOD = 998'244'353;
int ctoi(char c) {
if ('0' <= c && c <= '9')
return c - '0';
if ('a' <= c && c <= 'z')
return 10 + c - 'a';
return 10 + 'z' - 'a' + 1 + c - 'A';
}
int H[11][MAX][MAX], cnt[11][MAX][MAX][MAX];
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
cin >> n;
unordered_map<string, bool> in;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
if (in[s])
continue;
string rs = s;
reverse(s.begin(), s.end());
in[s] = in[rs] = true;
int a = ctoi(s[0]), b = ctoi(s.back());
H[s.length()][a][b]++;
if (s != rs)
H[s.length()][b][a]++;
}
ll res = 0;
for (int l = 3; l <= 10; l++) {
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
for (int k = 0; k < MAX; k++)
for (int w = 0; w < MAX; w++)
(cnt[l][i][j][k] += 1ll * H[l][w][i] * H[l][w][j] % MOD * H[l][w][k] % MOD) %= MOD;
for (int i = 0; i < MAX; i++) {
for (int j = 0; j < MAX; j++) {
for (int k = 0; k < MAX; k++) {
for (int w = 0; w < MAX; w++) {
res = (res + 1ll * cnt[l][j][k][w] * cnt[l][i][k][w] % MOD * cnt[l][i][j][w] % MOD * cnt[l][i][j][k] % MOD) % MOD;
}
}
}
}
}
cout << res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |