Submission #1041164

#TimeUsernameProblemLanguageResultExecution timeMemory
1041164antonCubeword (CEOI19_cubeword)C++17
84 / 100
211 ms16976 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> const int MOD = 998244353LL; const int MAX_N =32LL; int nbP[MAX_N][MAX_N]; int D[MAX_N][MAX_N][MAX_N]; int RES = 0; bool is_palindrome(string s){ bool ok = true; for(int i = 0; i<(s.size()+1)/2; i++){ ok &= (s[i] == s[s.size()-i-1]); } return ok; } int mexp(int a, int b){ int res = 1; vector<int>pows(1, a); for(int i= 1; i<35; i++){ pows.push_back((pows.back()*pows.back())%MOD); } for(int i = 0; i<35; i++){ if(0LL!=((1LL<<i)&b)){ res = (res * pows[i])%MOD; } } return res; } unordered_map<int, int> inv; int modinv(int a){ if(inv.find(a)!=inv.end()){ return inv[a]; } int b= mexp(a, MOD-2); inv[a] = b; assert((a*b)%MOD == 1); return b; } map<char, int> assign; void construct_table(){ for(char c= 'a'; c<='p'; c++){ assign[c] = assign.size(); } for(char c= 'A'; c<='P'; c++){ assign[c] = assign.size(); } /*for(char c= '0'; c<='9'; c++){ assign[c] = assign.size(); }*/ } vector<int> transform(string s){ vector<int> res(s.size()); for(int i = 0; i<s.size(); i++){ res[i] = assign[s[i]]; } return res; } int fact(int u){ if(u == 0){ return 1; } return fact(u-1)*u; } int nbperm(vector<int> v){ vector<pii> compressed; for(auto e: v){ if(compressed.size() == 0 || e != compressed.back().first){ compressed.push_back({e, 1}); } else{ compressed.back().second++; } } int res= fact(v.size()); for(auto e: compressed){ res = (res/fact(e.second)); } return res; } int prod(vector<int> v){ int res= 1; for(auto e: v){ res= (res*e)%MOD; } return res; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int N; cin>>N; vector<set<string>> words(11); construct_table(); for(int i = 0; i<N; i++){ string s; cin>>s; if(is_palindrome(s)){ words[s.size()].insert(s); } else{ words[s.size()].insert(s); reverse(s.begin(), s.end()); words[s.size()].insert(s); } } //vector<pair<int, vector<int>>> colorings= iterate_all(8,6); for(int len = 3; len<=10; len++){ fill(&nbP[0][0], &nbP[MAX_N][0], 0); fill(&D[0][0][0], &D[MAX_N][0][0], 0); for(auto e: words[len]){ auto v = transform(e); int a= v[0]; int b= v.back(); //cout<<e<<" "<<a<<" "<<b<<endl; nbP[a][b]++; } for(int i = 0; i<MAX_N; i++){ for(int j = i; j<MAX_N; j++){ for(int k = j; k<MAX_N; k++){ for(int l = 0; l<MAX_N; l++){ D[i][j][k] = (D[i][j][k]+prod({nbP[l][i],nbP[l][j], nbP[l][k]}))%MOD; } } } } for(int i = 0; i<MAX_N; i++){ for(int j = i; j<MAX_N; j++){ for(int k = j; k<MAX_N; k++){ for(int h = k; h<MAX_N; h++){ int coef = nbperm({i, j, k, h}); RES =(RES+ prod({coef, D[i][j][k], D[j][k][h], D[i][k][h], D[i][j][h]}))%MOD; } } } } } cout<<RES<<endl; }

Compilation message (stderr)

cubeword.cpp: In function 'bool is_palindrome(std::string)':
cubeword.cpp:16:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |     for(int i = 0; i<(s.size()+1)/2; i++){
      |                    ~^~~~~~~~~~~~~~~
cubeword.cpp: In function 'std::vector<long long int> transform(std::string)':
cubeword.cpp:67:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     for(int i = 0; i<s.size(); i++){
      |                    ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...