Submission #1183892

#TimeUsernameProblemLanguageResultExecution timeMemory
1183892UnforgettableplCubeword (CEOI19_cubeword)C++20
21 / 100
31 ms7864 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int MAX_N = 6;
const int modulo = 998244353;
int DP[2][MAX_N][MAX_N][MAX_N][MAX_N];
int cnt[11][MAX_N][MAX_N];

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    unordered_set<string> taken;
    for(int i=1;i<=n;i++){
        string s;cin>>s;
        if(taken.count(s))continue;
        int len = s.size();
        int st = 0;
        if('a'<=s[0] and s[0]<='z')st=s[0]-'a';
        else if('A'<=s[0] and s[0]<='Z')st=s[0]-'A'+26;
        else st=s[0]-'0'+52;
        int ed = 0;
        if('a'<=s[len-1] and s[len-1]<='z')ed=s[len-1]-'a';
        else if('A'<=s[len-1] and s[len-1]<='Z')ed=s[len-1]-'A'+26;
        else ed=s[len-1]-'0'+52;
        string rev = s;
        reverse(rev.begin(),rev.end());
        taken.insert(rev);
        cnt[len][st][ed]++;
        if(rev!=s)cnt[len][ed][st]++;
    }
    int ans = 0;
    for(int len=3;len<=10;len++){
        
        // for(int a=0;a<MAX_N;a++){
        //     for(int b=0;b<MAX_N;b++){
        //         for(int c=0;c<MAX_N;c++){
        //             for(int d=0;d<MAX_N;d++){
        //                 for(int e=0;e<MAX_N;e++){
        //                     for(int f=0;f<MAX_N;f++){
        //                         for(int g=0;g<MAX_N;g++){
        //                             for(int h=0;h<MAX_N;h++){
        //                                 int curr = 1;
        //                                 curr=(curr*cnt[len][a][b])%modulo;
        //                                 curr=(curr*cnt[len][b][c])%modulo;
        //                                 curr=(curr*cnt[len][c][d])%modulo;
        //                                 curr=(curr*cnt[len][d][a])%modulo;
        //                                 curr=(curr*cnt[len][e][f])%modulo;
        //                                 curr=(curr*cnt[len][f][g])%modulo;
        //                                 curr=(curr*cnt[len][g][h])%modulo;
        //                                 curr=(curr*cnt[len][h][e])%modulo;
        //                                 curr=(curr*cnt[len][a][e])%modulo;
        //                                 curr=(curr*cnt[len][b][f])%modulo;
        //                                 curr=(curr*cnt[len][c][g])%modulo;
        //                                 curr=(curr*cnt[len][d][h])%modulo;
        //                                 ans=(ans+curr)%modulo;
        //                             }
        //                         }
        //                     }
        //                 }
        //             }
        //         }
        //     }
        // }
        // continue;
        for(int a=0;a<MAX_N;a++){
            for(int b=0;b<MAX_N;b++){
                for(int c=0;c<MAX_N;c++){
                    for(int d=0;d<MAX_N;d++){
                        DP[0][a][b][c][d]=(cnt[len][a][b]*cnt[len][b][c])%modulo;
                        DP[0][a][b][c][d]*=(cnt[len][c][d]*cnt[len][d][a])%modulo;
                        DP[0][a][b][c][d]%=modulo;
                    }
                }
            }
        }
        for(int a=0;a<MAX_N;a++){
            for(int b=0;b<MAX_N;b++){
                for(int c=0;c<MAX_N;c++){
                    for(int d=0;d<MAX_N;d++){
                        DP[1][a][b][c][d]=0;
                        for(int e=0;e<MAX_N;e++){
                            DP[1][a][b][c][d]+=(cnt[len][a][e]*DP[0][e][b][c][d])%modulo;
                            DP[1][a][b][c][d]%=modulo;
                        }
                    }
                }
            }
        }
        for(int a=0;a<MAX_N;a++){
            for(int b=0;b<MAX_N;b++){
                for(int c=0;c<MAX_N;c++){
                    for(int d=0;d<MAX_N;d++){
                        DP[0][a][b][c][d]=0;
                        for(int e=0;e<MAX_N;e++){
                            DP[0][a][b][c][d]+=(cnt[len][b][e]*DP[1][a][e][c][d])%modulo;
                            DP[0][a][b][c][d]%=modulo;
                        }
                        DP[0][a][b][c][d]*=cnt[len][a][b];
                        DP[0][a][b][c][d]%=modulo;
                    }
                }
            }
        }
        for(int a=0;a<MAX_N;a++){
            for(int b=0;b<MAX_N;b++){
                for(int c=0;c<MAX_N;c++){
                    for(int d=0;d<MAX_N;d++){
                        DP[1][a][b][c][d]=0;
                        for(int e=0;e<MAX_N;e++){
                            DP[1][a][b][c][d]+=(cnt[len][c][e]*DP[0][a][b][e][d])%modulo;
                            DP[1][a][b][c][d]%=modulo;
                        }
                        DP[1][a][b][c][d]*=cnt[len][b][c];
                        DP[1][a][b][c][d]%=modulo;
                    }
                }
            }
        }
        for(int a=0;a<MAX_N;a++){
            for(int b=0;b<MAX_N;b++){
                for(int c=0;c<MAX_N;c++){
                    for(int d=0;d<MAX_N;d++){
                        DP[0][a][b][c][d]=0;
                        for(int e=0;e<MAX_N;e++){
                            DP[0][a][b][c][d]+=(cnt[len][d][e]*DP[1][a][b][c][e])%modulo;
                            DP[0][a][b][c][d]%=modulo;
                        }
                        DP[0][a][b][c][d]*=(cnt[len][c][d]*cnt[len][a][d])%modulo;
                        DP[0][a][b][c][d]%=modulo;
                        ans+=DP[0][a][b][c][d];
                        ans%=modulo;
                    }
                }
            }
        }
    }
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...