Submission #276154

#TimeUsernameProblemLanguageResultExecution timeMemory
276154theStaticMindCubeword (CEOI19_cubeword)C++14
50 / 100
446 ms16376 KiB
#include<bits/stdc++.h> #define pb push_back #define ii pair<int,int> #define all(x) (x).begin(),(x).end() #define sz(x) ((int)(x).size()) #define INF 100000000000000000 #define modulo 1000000007 #define mod 998244353 #define int long long int using namespace std; const int k = 16; int dp[k][k][k][k]; int dp2[k][k][k][k]; int cnt[k][k]; map<char, int> ptr; void clear(){ for(int a = 0; a < k; a++){ for(int b = 0; b < k; b++){ for(int c = 0; c < k; c++){ for(int d = 0; d < k; d++){ dp[a][b][c][d] = 0; dp2[a][b][c][d] = 0; } } } } } int solve(vector<vector<int>>& cnt){ clear(); /*for(auto p : cnt){ cout << p.first.first << "-" << p.first.second << "=>" << p.second << "\n"; }*/ for(int a = 0; a < k; a++){ for(int b = 0; b < k; b++){ for(int c = 0; c < k; c++){ for(int d = 0; d < k; d++){ dp[a][b][c][d] = cnt[a][b] * cnt[b][d] % mod * cnt[d][c] % mod * cnt[c][a] % mod; } } } } for(int a = 0; a < k; a++){ for(int b = 0; b < k; b++){ for(int c = 0; c < k; c++){ for(int d = 0; d < k; d++){ for(int f = 0; f < k; f++){ dp2[a][f][c][d] += dp[a][b][c][d] * cnt[b][f] % mod; dp2[a][f][c][d] %= mod; } } } } } for(int a = 0; a < k; a++){ for(int b = 0; b < k; b++){ for(int c = 0; c < k; c++){ for(int d = 0; d < k; d++){ dp[a][b][c][d] = 0; } } } } for(int a = 0; a < k; a++){ for(int f = 0; f < k; f++){ for(int c = 0; c < k; c++){ for(int d = 0; d < k; d++){ for(int h = 0; h < k; h++){ dp[a][f][c][h] += dp2[a][f][c][d] * cnt[d][h] % mod * cnt[f][h] % mod; dp[a][f][c][h] %= mod; } } } } } for(int a = 0; a < k; a++){ for(int b = 0; b < k; b++){ for(int c = 0; c < k; c++){ for(int d = 0; d < k; d++){ dp2[a][b][c][d] = 0; } } } } for(int a = 0; a < k; a++){ for(int f = 0; f < k; f++){ for(int c = 0; c < k; c++){ for(int h = 0; h < k; h++){ for(int g = 0; g < k; g++){ dp2[a][f][g][h] += dp[a][f][c][h] * cnt[c][g] % mod * cnt[g][h] % mod; dp2[a][f][g][h] %= mod; } } } } } int ret = 0; for(int a = 0; a < k; a++){ for(int f = 0; f < k; f++){ for(int g = 0; g < k; g++){ for(int h = 0; h < k; h++){ for(int e = 0; e < k; e++){ ret += dp2[a][f][g][h] * cnt[a][e] % mod * cnt[f][e] % mod * cnt[g][e] % mod; ret %= mod; } } } } } return ret; } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int n, ans = 0; cin >> n; unordered_set<string> S[11]; vector<string> arr; for(int i = 0; i < n; i++){ string s; cin >> s; S[sz(s)].insert(s); reverse(all(s)); S[sz(s)].insert(s); } for(char i = 'a'; i <= 'p'; i++) ptr[i] = 0; // for(char i = 'A'; i <= 'P'; i++) ptr[i] = 0; int ind = 0; for(auto& p : ptr){ p.second = ind++; } for(int i = 3; i <= 10; i++){ if(S[i].empty()) continue; vector<vector<int> > cnt(k, vector<int>(k, 0)); for(auto p : S[i]){ cnt[ptr[p[0]]][ptr[p[i - 1]]]++; } ans += solve(cnt); } cout << ans % mod; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...