@@ -12,15 +12,16 @@ using cp_algo::structures::bitpack;
12
12
const int maxn =1 <<12 ;
13
13
bitpack<maxn> a[maxn], b[maxn], c[maxn];
14
14
const int K =8 ;
15
- bitpack<maxn> precalc[maxn / K][ 1 << K];
15
+ bitpack<maxn> precalc[1 << K];
16
16
17
- void process_precalc () {
18
- for (int i =0 ; i < maxn / K; i++) {
19
- for (int j =0 ; j < K; j++) {
20
- int step =1 << j;
21
- for (int k =0 ; k < step; k++) {
22
- precalc[i][k + step] = precalc[i][k] ^ b[K * i + j];
23
- }
17
+ void process_precalc (int i) {
18
+ for (auto &it: precalc) {
19
+ it = bitpack<maxn>();
20
+ }
21
+ for (int j =0 ; j < K; j++) {
22
+ int step =1 << j;
23
+ for (int k =0 ; k < step; k++) {
24
+ precalc[k + step] = precalc[k] ^ b[K * i + j];
24
25
}
25
26
}
26
27
}
@@ -39,12 +40,11 @@ void solve() {
39
40
b[i] = row;
40
41
}
41
42
cp_algo::checkpoint (" read" );
42
- process_precalc ();
43
- cp_algo::checkpoint (" precalc" );
44
43
for (int j =0 ; j < m; j +=64 ) {
45
44
for (int z =0 ; z <64 / K; z++) {
45
+ process_precalc (j / K + z);
46
46
for (int i =0 ; i < n; i++) {
47
- c[i] ^= precalc[j / K + z][ uint8_t (a[i].word (j /64 ) >> K * z)];
47
+ c[i] ^= precalc[uint8_t (a[i].word (j /64 ) >> K * z)];
48
48
}
49
49
}
50
50
}