Submission #946813

# Submission time Handle Problem Language Result Execution time Memory
946813 2024-03-15T05:33:38 Z galen_colin Cubeword (CEOI19_cubeword) C++17
100 / 100
104 ms 45696 KB
/* not my code (obviously i don't code like this wtf) */

#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
 
#include <bits/stdc++.h>
using namespace std;
#define int long long
 
map<char, int> mp;
int c[11][62][62][62];
int prod[11][62][62][62];
int aa[11][63][63];
 
const int mod = 998244353;
const int msq = mod * mod;
 
inline int mul(int x, int y){
	if((x*y)>mod) return x*y%mod;
	return x*y;
}

using ll = long long;

namespace modop {
	ll madd(ll a, ll b) {
	  return (a + b) % mod;
	}
	ll msub(ll a, ll b) {
	  return (((a - b) % mod) + mod) % mod;
	}
	ll mmul(ll a, ll b) {
	  return ((a % mod) * (b % mod)) % mod;
	}
	ll mpow(ll base, ll exp) {
	  ll res = 1;
	  while (exp) {
		if (exp % 2 == 1){
			res = (res * base) % mod;
		}
		exp >>= 1;
		base = (base * base) % mod;
	  }
	  return res;
	}
	ll minv(ll base) {
	  return mpow(base, mod - 2);
	}
	ll mdiv(ll a, ll b) {
	  return mmul(a, minv(b));
	}
	
	const ll FACTORIAL_SIZE = 1.1e6;
	ll fact[FACTORIAL_SIZE], ifact[FACTORIAL_SIZE];
	bool __factorials_generated__ = 0;
	void gen_factorial(ll n) {
		__factorials_generated__ = 1;
		fact[0] = fact[1] = ifact[0] = ifact[1] = 1;
		
		for (ll i = 2; i <= n; i++) {
			fact[i] = (i * fact[i - 1]) % mod;
		}
		ifact[n] = minv(fact[n]);
		for (ll i = n - 1; i >= 2; i--) {
			ifact[i] = ((i + 1) * ifact[i + 1]) % mod;
		}
	}
	ll nck(ll n, ll k) {
		if (!__factorials_generated__) {
			cerr << "Call gen_factorial you dope" << endl;
			exit(1);
		}
		if (k < 0 || n < k) return 0;
		ll den = (ifact[k] * ifact[n - k]) % mod;
		return (den * fact[n]) % mod;
	}
}

using namespace modop;
 
void solve(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int cnt=0;
 
	for(int i='a'; i<='z'; i++) mp[i]=cnt++;
	for(int i='A'; i<='Z'; i++)	mp[i]=cnt++;
	for(int i='0'; i<='9'; i++)	mp[i]=cnt++;
	
	int n; cin>>n;
	vector<string> s(n), x;
		
	for(auto &i: s){
		cin >> i;
		string x = i;
		reverse(x.begin(), x.end());
		if(x<i) i=x;
	}
 
	sort(s.begin(), s.end());
	for(int i=0; i<n; i++){
		if(i==0||s[i]!=s[i-1]) x.push_back(s[i]);
	}

    memset(aa, 0, sizeof aa);
    memset(c, 0, sizeof c);
 
	s=x;
	n = s.size();	
 
	for(int i=0; i<n; i++){
		string x=s[i];
		reverse(x.begin(), x.end());
		if(x==s[i]) aa[x.size()][mp[x[0]]][mp[x.back()]]++;
		else aa[x.size()][mp[x[0]]][mp[x.back()]]++, aa[x.size()][mp[x.back()]][mp[x[0]]]++;
	}
	for(int i=3; i<=10; i++){
        for(int b=0; b<62; b++){
            for(int cc=b; cc<62; cc++){
                for(int j=0; j<62; j++){
                    prod[i][b][cc][j] = mul(aa[i][b][j], aa[i][cc][j]);
                }
            }
        }
        for(int a=0; a<62; a++){
            for(int b=a; b<62; b++){
                for(int cc=b; cc<62; cc++){
                    for(int j=0; j<62; j++){
						if ((c[i][a][b][cc] += aa[i][a][j] * prod[i][b][cc][j]) >= msq) c[i][a][b][cc] -= msq;
					}
                    c[i][a][b][cc] %= mod;
				}
			}
		}
	}
 
	int ans=0;
	for(int i=3; i<=10; i++){
		for(int a=0; a<62; a++){
			for(int b=a; b<62; b++){
				for(int cc=b; cc<62; cc++){
					for(int d=cc; d<62; d++){
 
					int val = 0;
					if(d==a) val = 291154603;
					else if(d==b) val=166374059;
					else if(cc==a) val= 166374059;
					else if(b==a && d==cc) val=748683265;
					else if(d==cc || b==a) val= 499122177;
					else if(cc==b) val = 499122177;
					else val=1;
 
					if (val != 1) {
                        if ((ans += val * mul(mul(c[i][a][b][cc], c[i][a][b][d]), mul(c[i][b][cc][d], c[i][a][cc][d]))) >= msq) ans -= msq;
                    } else {
                        if ((ans += mul(c[i][a][b][cc], c[i][a][b][d]) * mul(c[i][b][cc][d], c[i][a][cc][d])) >= msq) ans -= msq;
                    }
				}
                ans %= mod;
			}
			}
		}
 
	}

    ans = (ans * 24) % mod;
 
	cout<<ans<<'\n';
}   

signed main() {
    int t = 1;
    #ifdef galen_colin_local
    cin >> t;
    #endif
    while (t--) solve();
}
# Verdict Execution time Memory Grader output
1 Correct 104 ms 45248 KB Output is correct
2 Correct 93 ms 44552 KB Output is correct
3 Correct 94 ms 44676 KB Output is correct
4 Correct 93 ms 44988 KB Output is correct
5 Correct 95 ms 45432 KB Output is correct
6 Correct 93 ms 44536 KB Output is correct
7 Correct 92 ms 45504 KB Output is correct
8 Correct 93 ms 45636 KB Output is correct
9 Correct 96 ms 45432 KB Output is correct
10 Correct 92 ms 44484 KB Output is correct
11 Correct 93 ms 45696 KB Output is correct
12 Correct 93 ms 44988 KB Output is correct
13 Correct 92 ms 44424 KB Output is correct
14 Correct 93 ms 44732 KB Output is correct
15 Correct 92 ms 44532 KB Output is correct
16 Correct 96 ms 44736 KB Output is correct
17 Correct 93 ms 44480 KB Output is correct
18 Correct 97 ms 44832 KB Output is correct
19 Correct 93 ms 44720 KB Output is correct
20 Correct 92 ms 44416 KB Output is correct
21 Correct 94 ms 44912 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 104 ms 45248 KB Output is correct
2 Correct 93 ms 44552 KB Output is correct
3 Correct 94 ms 44676 KB Output is correct
4 Correct 93 ms 44988 KB Output is correct
5 Correct 95 ms 45432 KB Output is correct
6 Correct 93 ms 44536 KB Output is correct
7 Correct 92 ms 45504 KB Output is correct
8 Correct 93 ms 45636 KB Output is correct
9 Correct 96 ms 45432 KB Output is correct
10 Correct 92 ms 44484 KB Output is correct
11 Correct 93 ms 45696 KB Output is correct
12 Correct 93 ms 44988 KB Output is correct
13 Correct 92 ms 44424 KB Output is correct
14 Correct 93 ms 44732 KB Output is correct
15 Correct 92 ms 44532 KB Output is correct
16 Correct 96 ms 44736 KB Output is correct
17 Correct 93 ms 44480 KB Output is correct
18 Correct 97 ms 44832 KB Output is correct
19 Correct 93 ms 44720 KB Output is correct
20 Correct 92 ms 44416 KB Output is correct
21 Correct 94 ms 44912 KB Output is correct
22 Correct 95 ms 45248 KB Output is correct
23 Correct 92 ms 44676 KB Output is correct
24 Correct 94 ms 45580 KB Output is correct
25 Correct 92 ms 44668 KB Output is correct
26 Correct 94 ms 45504 KB Output is correct
27 Correct 95 ms 44756 KB Output is correct
28 Correct 92 ms 44480 KB Output is correct
29 Correct 92 ms 45592 KB Output is correct
30 Correct 92 ms 45116 KB Output is correct
31 Correct 96 ms 44932 KB Output is correct
32 Correct 93 ms 45656 KB Output is correct
33 Correct 94 ms 45364 KB Output is correct
34 Correct 93 ms 44476 KB Output is correct
35 Correct 92 ms 44668 KB Output is correct
36 Correct 95 ms 44656 KB Output is correct
37 Correct 92 ms 44476 KB Output is correct
38 Correct 92 ms 44992 KB Output is correct
39 Correct 103 ms 44680 KB Output is correct
40 Correct 100 ms 44920 KB Output is correct
41 Correct 92 ms 44676 KB Output is correct
42 Correct 93 ms 45500 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 104 ms 45248 KB Output is correct
2 Correct 93 ms 44552 KB Output is correct
3 Correct 94 ms 44676 KB Output is correct
4 Correct 93 ms 44988 KB Output is correct
5 Correct 95 ms 45432 KB Output is correct
6 Correct 93 ms 44536 KB Output is correct
7 Correct 92 ms 45504 KB Output is correct
8 Correct 93 ms 45636 KB Output is correct
9 Correct 96 ms 45432 KB Output is correct
10 Correct 92 ms 44484 KB Output is correct
11 Correct 93 ms 45696 KB Output is correct
12 Correct 93 ms 44988 KB Output is correct
13 Correct 92 ms 44424 KB Output is correct
14 Correct 93 ms 44732 KB Output is correct
15 Correct 92 ms 44532 KB Output is correct
16 Correct 96 ms 44736 KB Output is correct
17 Correct 93 ms 44480 KB Output is correct
18 Correct 97 ms 44832 KB Output is correct
19 Correct 93 ms 44720 KB Output is correct
20 Correct 92 ms 44416 KB Output is correct
21 Correct 94 ms 44912 KB Output is correct
22 Correct 95 ms 45248 KB Output is correct
23 Correct 92 ms 44676 KB Output is correct
24 Correct 94 ms 45580 KB Output is correct
25 Correct 92 ms 44668 KB Output is correct
26 Correct 94 ms 45504 KB Output is correct
27 Correct 95 ms 44756 KB Output is correct
28 Correct 92 ms 44480 KB Output is correct
29 Correct 92 ms 45592 KB Output is correct
30 Correct 92 ms 45116 KB Output is correct
31 Correct 96 ms 44932 KB Output is correct
32 Correct 93 ms 45656 KB Output is correct
33 Correct 94 ms 45364 KB Output is correct
34 Correct 93 ms 44476 KB Output is correct
35 Correct 92 ms 44668 KB Output is correct
36 Correct 95 ms 44656 KB Output is correct
37 Correct 92 ms 44476 KB Output is correct
38 Correct 92 ms 44992 KB Output is correct
39 Correct 103 ms 44680 KB Output is correct
40 Correct 100 ms 44920 KB Output is correct
41 Correct 92 ms 44676 KB Output is correct
42 Correct 93 ms 45500 KB Output is correct
43 Correct 95 ms 44720 KB Output is correct
44 Correct 95 ms 44736 KB Output is correct
45 Correct 97 ms 44664 KB Output is correct
46 Correct 97 ms 44720 KB Output is correct
47 Correct 98 ms 45500 KB Output is correct
48 Correct 97 ms 44736 KB Output is correct
49 Correct 100 ms 44820 KB Output is correct
50 Correct 95 ms 44736 KB Output is correct
51 Correct 96 ms 44932 KB Output is correct
52 Correct 94 ms 44720 KB Output is correct
53 Correct 97 ms 44840 KB Output is correct
54 Correct 99 ms 45440 KB Output is correct
55 Correct 96 ms 45504 KB Output is correct
56 Correct 96 ms 45508 KB Output is correct
57 Correct 94 ms 44480 KB Output is correct
58 Correct 99 ms 44984 KB Output is correct
59 Correct 95 ms 45188 KB Output is correct
60 Correct 100 ms 44732 KB Output is correct
61 Correct 94 ms 44480 KB Output is correct
62 Correct 95 ms 44928 KB Output is correct
63 Correct 96 ms 44740 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 104 ms 45248 KB Output is correct
2 Correct 93 ms 44552 KB Output is correct
3 Correct 94 ms 44676 KB Output is correct
4 Correct 93 ms 44988 KB Output is correct
5 Correct 95 ms 45432 KB Output is correct
6 Correct 93 ms 44536 KB Output is correct
7 Correct 92 ms 45504 KB Output is correct
8 Correct 93 ms 45636 KB Output is correct
9 Correct 96 ms 45432 KB Output is correct
10 Correct 92 ms 44484 KB Output is correct
11 Correct 93 ms 45696 KB Output is correct
12 Correct 93 ms 44988 KB Output is correct
13 Correct 92 ms 44424 KB Output is correct
14 Correct 93 ms 44732 KB Output is correct
15 Correct 92 ms 44532 KB Output is correct
16 Correct 96 ms 44736 KB Output is correct
17 Correct 93 ms 44480 KB Output is correct
18 Correct 97 ms 44832 KB Output is correct
19 Correct 93 ms 44720 KB Output is correct
20 Correct 92 ms 44416 KB Output is correct
21 Correct 94 ms 44912 KB Output is correct
22 Correct 95 ms 45248 KB Output is correct
23 Correct 92 ms 44676 KB Output is correct
24 Correct 94 ms 45580 KB Output is correct
25 Correct 92 ms 44668 KB Output is correct
26 Correct 94 ms 45504 KB Output is correct
27 Correct 95 ms 44756 KB Output is correct
28 Correct 92 ms 44480 KB Output is correct
29 Correct 92 ms 45592 KB Output is correct
30 Correct 92 ms 45116 KB Output is correct
31 Correct 96 ms 44932 KB Output is correct
32 Correct 93 ms 45656 KB Output is correct
33 Correct 94 ms 45364 KB Output is correct
34 Correct 93 ms 44476 KB Output is correct
35 Correct 92 ms 44668 KB Output is correct
36 Correct 95 ms 44656 KB Output is correct
37 Correct 92 ms 44476 KB Output is correct
38 Correct 92 ms 44992 KB Output is correct
39 Correct 103 ms 44680 KB Output is correct
40 Correct 100 ms 44920 KB Output is correct
41 Correct 92 ms 44676 KB Output is correct
42 Correct 93 ms 45500 KB Output is correct
43 Correct 95 ms 44720 KB Output is correct
44 Correct 95 ms 44736 KB Output is correct
45 Correct 97 ms 44664 KB Output is correct
46 Correct 97 ms 44720 KB Output is correct
47 Correct 98 ms 45500 KB Output is correct
48 Correct 97 ms 44736 KB Output is correct
49 Correct 100 ms 44820 KB Output is correct
50 Correct 95 ms 44736 KB Output is correct
51 Correct 96 ms 44932 KB Output is correct
52 Correct 94 ms 44720 KB Output is correct
53 Correct 97 ms 44840 KB Output is correct
54 Correct 99 ms 45440 KB Output is correct
55 Correct 96 ms 45504 KB Output is correct
56 Correct 96 ms 45508 KB Output is correct
57 Correct 94 ms 44480 KB Output is correct
58 Correct 99 ms 44984 KB Output is correct
59 Correct 95 ms 45188 KB Output is correct
60 Correct 100 ms 44732 KB Output is correct
61 Correct 94 ms 44480 KB Output is correct
62 Correct 95 ms 44928 KB Output is correct
63 Correct 96 ms 44740 KB Output is correct
64 Correct 98 ms 45604 KB Output is correct
65 Correct 96 ms 44932 KB Output is correct
66 Correct 96 ms 44740 KB Output is correct
67 Correct 102 ms 44656 KB Output is correct
68 Correct 95 ms 44672 KB Output is correct
69 Correct 97 ms 44740 KB Output is correct
70 Correct 96 ms 45692 KB Output is correct
71 Correct 96 ms 44740 KB Output is correct
72 Correct 96 ms 44736 KB Output is correct
73 Correct 96 ms 44968 KB Output is correct
74 Correct 97 ms 44928 KB Output is correct
75 Correct 97 ms 44768 KB Output is correct
76 Correct 102 ms 44740 KB Output is correct
77 Correct 96 ms 45060 KB Output is correct
78 Correct 98 ms 44988 KB Output is correct
79 Correct 97 ms 44732 KB Output is correct
80 Correct 95 ms 44736 KB Output is correct
81 Correct 95 ms 44660 KB Output is correct
82 Correct 96 ms 44988 KB Output is correct
83 Correct 97 ms 44676 KB Output is correct
84 Correct 95 ms 44976 KB Output is correct