Submission #1231025

#TimeUsernameProblemLanguageResultExecution timeMemory
1231025KindaNamelessCubeword (CEOI19_cubeword)C++20
100 / 100
422 ms8856 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 && c == 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...