Submission #898849

#TimeUsernameProblemLanguageResultExecution timeMemory
898849Iliya_Cubeword (CEOI19_cubeword)C++14
84 / 100
1160 ms8260 KiB
//IN THE NAME OF GOD #include<bits/stdc++.h> #pragma GCC optimize("O2,unroll-loops") #define endl '\n' #define F first #define S second #define pii pair<int,int> #define all(x) x.begin(),x.end() #define pb push_back #define fast_io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define file_io freopen("input.in" , "r" , stdin) ; freopen("output.out" , "w" , stdout); using namespace std; typedef long long ll; typedef long double dll; const int N = 62, NN = 11, mod = 998244353; int hav[NN][N][N], havi[NN], can[NN][N], dp[N][N][N]; vector<string> vec[NN]; inline int f(char c){ if (int(c) <= 57) return (int(c)-48); else if (int(c) <= 90) return (int(c)-65+10); else return (int(c)-97+36); } inline char ff(int x){ if (x < 10) return char(x+48); else if (x < 36) return char(x+65-10); else return char(x+97-36); } int32_t main(){ fast_io; int n; cin >> n; string s, ss; int siz; for(int i=1; i<=n; i++){ cin >> s; ss = s; siz = s.size(); havi[siz] = 1; vec[siz].pb(s); reverse(all(ss)); if (ss != s) vec[siz].pb(ss); } for(int i=3; i<=10; i++){ sort(all(vec[i])); for(int j=0; j<int(vec[i].size()); j++){ if (j != 0 && vec[i][j] == vec[i][j-1]) continue; can[i][f(vec[i][j][0])] = 1; hav[i][f(vec[i][j][0])][f(vec[i][j].back())]++; } } ll ans = 0, tmp; for(int i=3; i<=10; i++){ if (!havi[i]) continue; memset(dp,0,sizeof dp); for(int s1 = 0; s1<N; s1++){ if (!can[i][s1]) continue; for(int s2 = 0; s2<N; s2++){ if (!can[i][s2]) continue; for(int s3 = 0; s3 < N; s3++){ if (!can[i][s3]) continue; for(int put=0; put<N; put++) dp[s1][s2][s3] = (dp[s1][s2][s3]+1ll*hav[i][s1][put]*hav[i][s2][put]*hav[i][s3][put]%mod)%mod; } } } for(int s1 = 0; s1<N; s1++){ if (!can[i][s1]) continue; for(int s2=0; s2<N; s2++){ if (!can[i][s2]) continue; for(int s3=0; s3<N; s3++){ if (!can[i][s3]) continue; for(int s4=0; s4<N; s4++){ if (!can[i][s4]) continue; tmp = 1ll*dp[s1][s2][s3]*dp[s1][s2][s4]%mod*dp[s1][s3][s4]%mod*dp[s2][s3][s4]%mod; ans = (ans+tmp)%mod; } } } } } cout << ans << endl; 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...