# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
660101 | 600Mihnea | Cubeword (CEOI19_cubeword) | C++17 | 64 ms | 7904 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
bool home = 0;
#include <bits/stdc++.h>
using namespace std;
const int MODULO = 998244353;
int get_char_id(char ch) {
assert(('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('0' <= ch && ch <= '9'));
if ('a' <= ch && ch <= 'z') {
return ch - 'a';
}
if ('A' <= ch && ch <= 'Z') {
return 1 + get_char_id('z') + ch - 'A';
}
return 1 + get_char_id('Z') + ch - '0';
}
const int MAX_WORD_LENGTH = 10;
///const int ALPHABET_SIZE = 2 * 26 + 10;
const int ALPHABET_SIZE = 16;
vector<string> words[MAX_WORD_LENGTH + 1];
int cnt_words[ALPHABET_SIZE][ALPHABET_SIZE];
int cnt3[ALPHABET_SIZE][ALPHABET_SIZE][ALPHABET_SIZE];
int main() {
if (home == 0) {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
} else {
freopen ("input.txt", "r", stdin);
}
{
size_t num_samples;
cin >> num_samples;
for (size_t sample_index = 0; sample_index < num_samples; sample_index++) {
string word;
cin >> word;
words[word.size()].push_back(word);
}
}
int solution = 0;
for (size_t word_length = 1; word_length <= MAX_WORD_LENGTH; word_length++) {
if (words[word_length].empty()) {
continue;
}
size_t word_count = words[word_length].size();
for (size_t word_index = 0; word_index < word_count; word_index++) {
string reverse_word = words[word_length][word_index];
reverse(reverse_word.begin(), reverse_word.end());
words[word_length].push_back(reverse_word);
}
sort(words[word_length].begin(), words[word_length].end());
words[word_length].resize(unique(words[word_length].begin(), words[word_length].end()) - words[word_length].begin());
word_count = words[word_length].size();
for (size_t first_letter = 0; first_letter < ALPHABET_SIZE; first_letter++) {
for (size_t last_letter = 0; last_letter < ALPHABET_SIZE; last_letter++) {
cnt_words[first_letter][last_letter] = 0;
}
}
for (size_t word_index = 0; word_index < word_count; word_index++) {
cnt_words[get_char_id(words[word_length][word_index][0])][get_char_id(words[word_length][word_index].back())]++;
}
for (size_t a = 0; a < ALPHABET_SIZE; a++) {
for (size_t b = a; b < ALPHABET_SIZE; b++) {
for (size_t c = b; c < ALPHABET_SIZE; c++) {
cnt3[a][b][c] = 0;
for (size_t d = 0; d < ALPHABET_SIZE; d++) {
cnt3[a][b][c] = (cnt3[a][b][c] + 1LL * cnt_words[d][a] * cnt_words[d][b] * cnt_words[d][c]) % MODULO;
}
cnt3[a][c][b] = cnt3[b][a][c] = cnt3[b][c][a] = cnt3[c][a][b] = cnt3[c][b][a] = cnt3[a][b][c];
}
}
}
for (size_t a = 0; a < ALPHABET_SIZE; a++) {
for (size_t b = a + 1; b < ALPHABET_SIZE; b++) {
for (size_t c = b + 1; c < ALPHABET_SIZE; c++) {
for (size_t d = c + 1; d < ALPHABET_SIZE; d++) {
if (a != b && a != c && a != d && b != c && b != d && c != d) {
int x1 = cnt3[a][b][c];
int x2 = cnt3[a][d][b];
int x3 = cnt3[a][c][d];
int x4 = cnt3[b][c][d];
solution = (solution + 1LL * x1 * x2 % MODULO * x3 % MODULO * x4) % MODULO;
}
}
}
}
}
for (size_t a = 0; a < ALPHABET_SIZE; a++) {
for (size_t b = 0; b < ALPHABET_SIZE; b++) {
for (size_t c = 0; c < ALPHABET_SIZE; c++) {
for (size_t d = 0; d < ALPHABET_SIZE; d++) {
if (a == b || a == c || a == d || b == c || b == d || c == d) {
int x1 = cnt3[a][b][c];
int x2 = cnt3[a][d][b];
int x3 = cnt3[a][c][d];
int x4 = cnt3[b][c][d];
solution = (solution + 1LL * x1 * x2 % MODULO * x3 % MODULO * x4) % MODULO;
}
}
}
}
}
}
cout << solution << "\n";
return 0;
}
Compilation message (stderr)
# | 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... |