제출 #276043

#제출 시각아이디문제언어결과실행 시간메모리
276043theStaticMindCubeword (CEOI19_cubeword)C++14
21 / 100
381 ms15396 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 = 8; int dp[k][k][k][k]; int dp2[k][k][k][k]; int dp3[k][k][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; dp3[a][b][c][d] = 0; } } } } } int solve(map<ii, 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 e = 0; e < k; e++){ for(int f = 0; f < k; f++){ dp2[a][b][e][f] += dp[c][d][e][f] * cnt[{a, c}] % mod * cnt[{b, d}] % mod * cnt[{a, b}] % mod; dp2[a][b][e][f] %= 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 e = 0; e < k; e++){ for(int f = 0; f < k; f++){ dp3[a][b][e][f] += dp2[c][d][e][f] * cnt[{a, c}] % mod * cnt[{b, d}] % mod * cnt[{a, b}] % mod; dp3[a][b][e][f] %= mod; } } } } } } int ret = 0; 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++){ ret += dp3[a][b][c][d] * cnt[{a, c}] % mod * cnt[{b, d}]; 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; map<ii, int> cnt; 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...