Submission #283460

#TimeUsernameProblemLanguageResultExecution timeMemory
283460dolphingarlicCubeword (CEOI19_cubeword)C++14
100 / 100
402 ms18084 KiB
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const ll MOD = 998244353;

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

set<string> words[11];
ll cnt[62][62], dp[62][62][62], perm[8] = {24, 12, 12, 4, 12, 6, 4, 1};

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		words[s.size()].insert(s);
		reverse(s.begin(), s.end());
		words[s.size()].insert(s);
	}

	ll ans = 0;
	for (int l = 3; l < 11; l++) {
		memset(cnt, 0, sizeof cnt);
		memset(dp, 0, sizeof dp);
		for (string i : words[l]) cnt[id(i[0])][id(i.back())]++;
		for (int i = 0; i < 62; i++) {
			for (int a = 0; a < 62; a++) {
				for (int b = a; b < 62; b++) {
					for (int c = b; c < 62; c++) {
						dp[a][b][c] = (dp[a][b][c] + cnt[i][a] * cnt[i][b] % MOD * cnt[i][c] % MOD) % MOD;
					}
				}
			}
		}
		for (int a = 0; a < 62; a++) {
			for (int b = a; b < 62; b++) {
				for (int c = b; c < 62; c++) {
					for (int d = c; d < 62; d++) {
						int mask = (a == b) << 2 | (b == c) << 1 | (c == d);
						ans = (ans + dp[a][b][c] * dp[a][b][d] % MOD * dp[a][c][d] % MOD * dp[b][c][d] % MOD * perm[mask] % 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...