Submission #1231021

#TimeUsernameProblemLanguageResultExecution timeMemory
1231021KindaNamelessCubeword (CEOI19_cubeword)C++20
0 / 100
395 ms8704 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double

const ll MOD = 998244353;

int id(char c) {
    if('0' <= c && c <= '9') {
        return c - '0';
    }
    if('A' <= c && c <= 'Z') {
        return 10 + c - 'A';
    }
    return 36 + c - 'a';
}

ll perm(int a, int b, int c, int d) {
    if(a == b && b == c && c == d) {
        return 1;
    }
    if(a == b && b == c) {
        return 4;
    }
    if(b == c && d == d) {
        return 4;
    }
    if(a == b && c == d) {
        return 6;
    }
    if(a == b) {
        return 12;
    }
    if(b == c) {
        return 12;
    }
    if(c == d) {
        return 12;
    }
    return 24;
}

vector<string> inc[11];

ll calc(int len) {
    if(inc[len].empty()) {
        return 0;
    }

    sort(inc[len].begin(), inc[len].end());
    inc[len].resize(unique(inc[len].begin(), inc[len].end()) - inc[len].begin());

    vector<vector<ll>> direct(62, vector<ll>(62, 0));

    for(string elem : inc[len]) {
        direct[id(elem[0])][id(elem.back())]++;
    }

    vector<vector<vector<ll>>> dp(62, vector<vector<ll>>(62, vector<ll>(62, 0)));

    for(int a = 0; a < 62; ++a){
        for(int b = 0; b < 62; ++b) {
            for(int c = 0; c < 62; ++c) {
                for(int d = 0; d < 62; ++d) {
                    dp[a][b][c] += direct[a][d] * direct[b][d] % MOD * direct[c][d] % MOD;
                    if(dp[a][b][c] >= MOD)dp[a][b][c] -= MOD;
                }
            }
        }
    }

    ll answer = 0;
    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) {
                    answer += perm(a, b, c, d) * dp[a][b][c] % MOD * dp[a][b][d] % MOD * dp[a][c][d] % MOD * dp[b][c][d] % MOD;
                    if(answer >= MOD)answer -= MOD;
                }
            }
        }
    }

    return answer;
}

void solve() {
    int N; cin >> N;

    for(int i = 1; i <= N; ++i) {
        string s; cin >> s;
        inc[(int)s.size()].push_back(s);
        inc[(int)s.size()].push_back(string(s.rbegin(), s.rend()));
    }

    ll answer = 0;
    for(int len = 3; len <= 10; ++len) {
        answer += calc(len);
        if(answer >= MOD)answer -= MOD;
    }

    cout << answer;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    int tc = 1; //cin >> tc;

    while(tc--) {
        solve();
    }

    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...