Submission #1255902

#TimeUsernameProblemLanguageResultExecution timeMemory
1255902FaggiCubeword (CEOI19_cubeword)C++20
0 / 100
1194 ms21248 KiB
#include <bits/stdc++.h>
#define ll int
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

const int MOD = 998244353;
const int ma = 59;
ll dis[8][ma][ma]; // tam, in, fin
ll memo[8][ma][ma][ma];

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll n, i, tam, j, k, l, cant, act = 0, ant, tot = 0, u, an, bn, cn, dn;
    cin >> n;
    string s, a;
    map<string, bool> m;
    vector<ll> pos('z' + 1, 0);
    for (i = 'a'; i <= 'z'; i++)
        pos[i] = act++;
    for (i = 'A'; i <= 'Z'; i++)
        pos[i] = act++;
    for (i = '0'; i <= '9'; i++)
        pos[i] = act++;
    for (i = 0; i < n; i++)
    {
        cin >> s;
        tam = sz(s);
        a = s;
        reverse(all(a));
        if (m[s] == 0)
        {
            dis[tam - 3][pos[s[0]]][pos[s.back()]]++;
            m[s] = 1;
        }
        if (a != s && m[a] == 0)
        {
            dis[tam - 3][pos[a[0]]][pos[a.back()]]++;
            m[a] = 1;
        }
    }

    for (tam = 3; tam <= 10; tam++)
    {
        for (i = 0; i < ma; i++)
        {
            for (j = 0; j < ma; j++)
            {
                for (k = 0; k < ma; k++)
                {
                    for (u = 0; u < ma; u++)
                    {
                        act = 1;
                        act = (1ll * act * dis[tam - 3][i][u]) % MOD;
                        act = (1ll * act * dis[tam - 3][j][u]) % MOD;
                        act = (1ll * act * dis[tam - 3][k][u]) % MOD;
                        memo[tam - 3][i][j][k] = (act + memo[tam - 3][i][j][k]) % MOD;
                    }
                }
            }
        }
    }
    for (i = 0; i < ma; i++) // 1
    {
        for (j = 0; j < ma; j++) // 2
        {
            for (k = 0; k < ma; k++) // 3
            {
                for (l = 0; l < ma; l++) // 4
                {
                    if (i == 5 && i == j && i == l && i == k)
                    {
                        cant = 1;
                    }
                    // 5
                    cant = 1;
                    an = memo[0][i][l][k];
                    // 6
                    bn = memo[0][i][j][k];
                    // 7
                    cn = memo[0][j][l][k];
                    // 8
                    dn = memo[0][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                    // 5
                    cant = 1;
                    an = memo[1][i][l][k];
                    // 6
                    bn = memo[1][i][j][k];
                    // 7
                    cn = memo[1][j][l][k];
                    // 8
                    dn = memo[1][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                    // 5
                    cant = 1;
                    an = memo[2][i][l][k];
                    // 6
                    bn = memo[2][i][j][k];
                    // 7
                    cn = memo[2][j][l][k];
                    // 8
                    dn = memo[2][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                    // 5
                    cant = 1;
                    an = memo[3][i][l][k];
                    // 6
                    bn = memo[3][i][j][k];
                    // 7
                    cn = memo[3][j][l][k];
                    // 8
                    dn = memo[3][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                    // 5
                    cant = 1;
                    an = memo[4][i][l][k];
                    // 6
                    bn = memo[4][i][j][k];
                    // 7
                    cn = memo[4][j][l][k];
                    // 8
                    dn = memo[4][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                    // 5
                    cant = 1;
                    an = memo[5][i][l][k];
                    // 6
                    bn = memo[5][i][j][k];
                    // 7
                    cn = memo[5][j][l][k];
                    // 8
                    dn = memo[5][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                    // 5
                    cant = 1;
                    an = memo[6][i][l][k];
                    // 6
                    bn = memo[6][i][j][k];
                    // 7
                    cn = memo[6][j][l][k];
                    // 8
                    dn = memo[6][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                    // 5
                    cant = 1;
                    an = memo[7][i][l][k];
                    // 6
                    bn = memo[7][i][j][k];
                    // 7
                    cn = memo[7][j][l][k];
                    // 8
                    dn = memo[7][i][j][l];
                    cant = (1ll * cant * an * bn * cn * dn) % MOD;
                    cant = (1ll * cant * bn) % MOD;
                    cant = (1ll * cant * cn) % MOD;
                    cant = (1ll * cant * dn) % MOD;
                    tot = (tot + cant) % MOD;
                }
            }
        }
    }

    cout << tot;
    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...