제출 #1261765

#제출 시각아이디문제언어결과실행 시간메모리
1261765vtnooCubeword (CEOI19_cubeword)C++20
50 / 100
108 ms15664 KiB
#include <bits/stdc++.h>

using namespace std;

const int mod=998244353, N=16;
int cnt[11][26][26];
long long dp[N][N][N];
set<string> sc;

int main(){
    int n;cin>>n;
    for(int i=0;i<n;i++){
        string s;
        cin>>s;
        if(sc.count(s))continue;
        string s_r=s;
        reverse(s_r.begin(), s_r.end());
        sc.insert(s);
        int a=s.front()-'a', b=s.back()-'a';
        cnt[(int)s.size()][a][b]++;
        if(s!=s_r){
            cnt[(int)s.size()][b][a]++;
            sc.insert(s_r);
        }
    }
    long long ans=0;
    for(int len=3;len<=10;len++){
        memset(dp, 0, sizeof(dp));
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                for(int k=0;k<N;k++){
                    for(int l=0;l<N;l++){
                        dp[i][j][k]+=(((cnt[len][i][l]*cnt[len][j][l])%mod)*cnt[len][k][l])%mod;
                        dp[i][j][k]%=mod;
                    }   
                }
            }
        }  
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                for(int k=0;k<N;k++){
                    for(int l=0;l<N;l++){
                        long long cur=dp[i][j][k];
                        cur%=mod;
                        cur*=dp[j][k][l];
                        cur%=mod;
                        cur*=dp[i][k][l];
                        cur%=mod;
                        cur*=dp[i][j][l];
                        cur%=mod;
                        ans+=cur;
                        ans%=mod;
                    }   
                }
            }
        }    
    }
    cout<<ans%mod<<endl;
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...