제출 #1135987

#제출 시각아이디문제언어결과실행 시간메모리
1135987AvianshCubeword (CEOI19_cubeword)C++20
0 / 100
172 ms14740 KiB
#include <bits/stdc++.h>

using namespace std;

int mod =  998244353;

bool palindrome(string s){
    int n = s.size();
    for(int i = 0;i<n;i++){
        if(s[i]!=s[n-i-1]){
            return 0;
        }
    }
    return 1;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    map<array<char,2>,long long> num[11];
    set<char>poss;
    set<string>done;
    for(int i = 0;i<n;i++){
        string s;
        cin >> s;
        if(done.find(s)!=done.end()){
            continue;
        }
        num[s.size()][{s[0],s[s.size()-1]}]++;
        poss.insert(s[0]);
        poss.insert(s[s.size()-1]);
        done.insert(s);
        if(!palindrome(s)){
            num[s.size()][{s[s.size()-1],s[0]}]++;
            reverse(s.begin(),s.end());
            done.insert(s);
        }
    }
    vector<char>pos;
    for(char a : poss){
        pos.push_back(a);
    }
    long long ans = 0;
    for(int len = 0;len<11;len++){
        map<array<char,3>,long long>val;
        for(int i = 0;i<pos.size();i++){
            for(int j = 0;j<pos.size();j++){
                for(int k = 0;k<pos.size();k++){
                    for(int cor = 0;cor<pos.size();cor++){
                        array<char,3>curr = {pos[i],pos[j],pos[k]};
                        val[curr]+=(((1LL*num[len][{pos[cor],curr[0]}]*num[len][{pos[cor],curr[1]}])%mod)*num[len][{pos[cor],curr[2]}])%mod;
                        val[curr]%=mod;
                    }
                }
            }
        }
        for(pair<array<char,3>,long long>p1:val){
            for(pair<array<char,3>,long long>p2:val){
                long long mid = ((((((((((num[len][{p1.first[0],p2.first[0]}]*num[len][{p1.first[0],p2.first[1]}])%mod)*num[len][{p1.first[1],p2.first[1]}])%mod)*num[len][{p1.first[1],p2.first[2]}])%mod)*num[len][{p1.first[2],p2.first[2]}])%mod)*num[len][{p1.first[2],p2.first[0]}])%mod);
                ans+=1LL*p1.second*p2.second*(mid);
                ans%=mod;
            }
        }
    }
    cout << ans;
    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...