22 " https://judge.yosupo.jp/problem/intersection_of_f2_vector_spaces"
33#include " ../template.hpp"
44#include " ../../../library/math/matrix_related/xor_basis_unordered_intersection.hpp"
5+ #include " ../../../library/math/matrix_related/xor_basis_ordered.hpp"
56// checking the condition: for 0 <= i < j < sz(b):
67// (bit_floor(b[i]) & b[j]) == 0
7- void check_condition (const basis& b) {
8+ void check_condition_unordered (const basis& b) {
89 int n = sz (b.b );
910 int or_bits = 0 ;
1011 for (int i = n - 1 ; i >= 0 ; i--) {
@@ -13,6 +14,25 @@ void check_condition(const basis& b) {
1314 or_bits |= b.b [i];
1415 }
1516}
17+ void check_condition_ordered (
18+ const basis_ordered<int >& basis2,
19+ const basis_ordered<ll>& basis3,
20+ const basis_ordered<bitset<lg>>& basis4) {
21+ int or_bits2 = 0 ;
22+ ll or_bits3 = 0 ;
23+ bitset<lg> or_bits4 = 0 ;
24+ for (int i = 0 ; i < lg; i++) {
25+ assert (
26+ (bit_floor (uint64_t (basis2.b [i])) & or_bits2) == 0 );
27+ assert (
28+ (bit_floor (uint64_t (basis3.b [i])) & or_bits3) == 0 );
29+ assert ((bit_floor (uint64_t (basis4.b [i].to_ullong ())) &
30+ or_bits4.to_ullong ()) == 0 );
31+ or_bits2 |= basis2.b [i];
32+ or_bits3 |= basis3.b [i];
33+ or_bits4 |= basis4.b [i];
34+ }
35+ }
1636int main () {
1737 cin.tie (0 )->sync_with_stdio (0 );
1838 int t;
@@ -21,23 +41,45 @@ int main() {
2141 int n;
2242 cin >> n;
2343 basis basis1;
44+ basis_ordered<int > basis2;
45+ basis_ordered<ll> basis3;
46+ basis_ordered<bitset<lg>> basis4;
2447 for (int i = 0 ; i < n; i++) {
2548 int val;
2649 cin >> val;
2750 assert (basis1.insert (val));
51+ assert (!basis1.insert (val));
52+ assert (basis2.insert (val));
53+ assert (!basis2.insert (val));
54+ assert (basis3.insert (val));
55+ assert (!basis3.insert (val));
56+ assert (basis4.insert (val));
57+ assert (!basis4.insert (val));
2858 }
29- check_condition (basis1);
59+ check_condition_unordered (basis1);
60+ check_condition_ordered (basis2, basis3, basis4);
3061 int m;
3162 cin >> m;
32- basis basis2;
63+ basis basis5;
64+ basis_ordered<int > basis6;
65+ basis_ordered<ll> basis7;
66+ basis_ordered<bitset<lg>> basis8;
3367 for (int j = 0 ; j < m; j++) {
3468 int val;
3569 cin >> val;
36- assert (basis2.insert (val));
70+ assert (basis5.insert (val));
71+ assert (!basis5.insert (val));
72+ assert (basis6.insert (val));
73+ assert (!basis6.insert (val));
74+ assert (basis7.insert (val));
75+ assert (!basis7.insert (val));
76+ assert (basis8.insert (val));
77+ assert (!basis8.insert (val));
3778 }
38- check_condition (basis2);
39- basis inter = intersection (basis1, basis2);
40- check_condition (inter);
79+ check_condition_unordered (basis5);
80+ check_condition_ordered (basis6, basis7, basis8);
81+ basis inter = intersection (basis1, basis5);
82+ check_condition_unordered (inter);
4183 cout << sz (inter.b ) << " " ;
4284 for (int val : inter.b ) cout << val << " " ;
4385 cout << ' \n ' ;
0 commit comments