Submission #1255895

#TimeUsernameProblemLanguageResultExecution timeMemory
1255895FaggiCubeword (CEOI19_cubeword)C++20
0 / 100
1196 ms22968 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 = 64;
ll dis[8][ma][ma]; // tam, in, fin

ll tots[8][ma][ma][ma][ma];
ll memo[8][ma][ma][ma];

ll calc(ll tam, ll i, ll j)
{
    ll cant = 0;
    cant = dis[tam-3][i][j] % MOD;
    return cant;
}

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(max('z', max('Z','9')) + 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 = (act * calc(tam, i, u)) % MOD;
                        act = (act * calc(tam, j, u)) % MOD;
                        act = (act * calc(tam, k, u)) % MOD;
                        memo[tam-3][i][j][k] = (act + memo[tam-3][i][j][k]) % MOD;
                    }
                }
            }
        }
    }

    for (tam = 3; tam <= 10; tam++)
    {
        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[tam-3][i][l][k];
                        // 6
                        bn = memo[tam-3][i][j][k];
                        // 7
                        cn = memo[tam-3][j][l][k];
                        // 8
                        dn = memo[tam-3][i][j][l];
                        cant = (cant * an) % MOD;
                        cant = (cant * bn) % MOD;
                        cant = (cant * cn) % MOD;
                        cant = (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...