competitive/data_structure/
bitset.rs1#![allow(clippy::suspicious_op_assign_impl)]
2
3use std::ops::{
4 BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Shl, ShlAssign, Shr,
5 ShrAssign,
6};
7
8#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
9pub struct BitSet {
10 size: usize,
11 bits: Vec<u64>,
12}
13impl BitSet {
14 pub fn new(size: usize) -> Self {
15 Self {
16 size,
17 bits: vec![0; (size + 63) / 64],
18 }
19 }
20 pub fn ones(size: usize) -> Self {
21 let mut self_ = Self {
22 size,
23 bits: vec![u64::MAX; (size + 63) / 64],
24 };
25 self_.trim();
26 self_
27 }
28 #[inline]
29 pub fn get(&self, i: usize) -> bool {
30 self.bits[i >> 6] & (1 << (i & 63)) != 0
31 }
32 #[inline]
33 pub fn set(&mut self, i: usize, b: bool) {
34 if b {
35 self.bits[i >> 6] |= 1 << (i & 63);
36 } else {
37 self.bits[i >> 6] &= !(1 << (i & 63));
38 }
39 }
40 #[inline]
41 pub fn count_ones(&self) -> u64 {
42 self.bits.iter().map(|x| x.count_ones() as u64).sum()
43 }
44 #[inline]
45 pub fn count_zeros(&self) -> u64 {
46 self.size as u64 - self.count_ones()
47 }
48 #[inline]
49 fn trim(&mut self) {
50 if self.size & 63 != 0 {
51 if let Some(x) = self.bits.last_mut() {
52 *x &= 0xffff_ffff_ffff_ffff >> (64 - (self.size & 63));
53 }
54 }
55 }
56 #[inline]
57 pub fn shl_bitor_assign(&mut self, rhs: usize) {
58 let n = self.bits.len();
59 let k = rhs >> 6;
60 let d = rhs & 63;
61 if k < n {
62 if d == 0 {
63 for i in (0..n - k).rev() {
64 self.bits[i + k] |= self.bits[i];
65 }
66 } else {
67 for i in (1..n - k).rev() {
68 self.bits[i + k] |= (self.bits[i] << d) | (self.bits[i - 1] >> (64 - d));
69 }
70 self.bits[k] |= self.bits[0] << d;
71 }
72 self.trim();
73 }
74 }
75 #[inline]
76 pub fn shr_bitor_assign(&mut self, rhs: usize) {
77 let n = self.bits.len();
78 let k = rhs >> 6;
79 let d = rhs & 63;
80 if k < n {
81 if d == 0 {
82 for i in k..n {
83 self.bits[i - k] |= self.bits[i];
84 }
85 } else {
86 for i in k..n - 1 {
87 self.bits[i - k] |= (self.bits[i] >> d) | (self.bits[i + 1] << (64 - d));
88 }
89 self.bits[n - k - 1] |= self.bits[n - 1] >> d;
90 }
91 }
92 }
93}
94impl ShlAssign<usize> for BitSet {
95 #[inline]
96 fn shl_assign(&mut self, rhs: usize) {
97 let n = self.bits.len();
98 let k = rhs >> 6;
99 let d = rhs & 63;
100 if k >= n {
101 for x in self.bits.iter_mut() {
102 *x = 0;
103 }
104 } else {
105 if d == 0 {
106 for i in (0..n - k).rev() {
107 self.bits[i + k] = self.bits[i];
108 }
109 } else {
110 for i in (1..n - k).rev() {
111 self.bits[i + k] = (self.bits[i] << d) | (self.bits[i - 1] >> (64 - d));
112 }
113 self.bits[k] = self.bits[0] << d;
114 }
115 for x in self.bits[..k].iter_mut() {
116 *x = 0;
117 }
118 self.trim();
119 }
120 }
121}
122impl Shl<usize> for BitSet {
123 type Output = Self;
124 #[inline]
125 fn shl(mut self, rhs: usize) -> Self::Output {
126 self <<= rhs;
127 self
128 }
129}
130impl ShrAssign<usize> for BitSet {
131 #[inline]
132 fn shr_assign(&mut self, rhs: usize) {
133 let n = self.bits.len();
134 let k = rhs >> 6;
135 let d = rhs & 63;
136 if k >= n {
137 for x in self.bits.iter_mut() {
138 *x = 0;
139 }
140 } else {
141 if d == 0 {
142 for i in k..n {
143 self.bits[i - k] = self.bits[i];
144 }
145 } else {
146 for i in k..n - 1 {
147 self.bits[i - k] = (self.bits[i] >> d) | (self.bits[i + 1] << (64 - d));
148 }
149 self.bits[n - k - 1] = self.bits[n - 1] >> d;
150 }
151 for x in self.bits[n - k..].iter_mut() {
152 *x = 0;
153 }
154 }
155 }
156}
157impl Shr<usize> for BitSet {
158 type Output = Self;
159 #[inline]
160 fn shr(mut self, rhs: usize) -> Self::Output {
161 self >>= rhs;
162 self
163 }
164}
165impl<'a> BitOrAssign<&'a BitSet> for BitSet {
166 #[inline]
167 fn bitor_assign(&mut self, rhs: &'a Self) {
168 for (l, r) in self.bits.iter_mut().zip(rhs.bits.iter()) {
169 *l |= *r;
170 }
171 self.trim();
172 }
173}
174impl<'a> BitOr<&'a BitSet> for BitSet {
175 type Output = Self;
176 #[inline]
177 fn bitor(mut self, rhs: &'a Self) -> Self::Output {
178 self |= rhs;
179 self
180 }
181}
182impl<'b> BitOr<&'b BitSet> for &BitSet {
183 type Output = BitSet;
184 #[inline]
185 fn bitor(self, rhs: &'b BitSet) -> Self::Output {
186 let mut res = self.clone();
187 res |= rhs;
188 res
189 }
190}
191impl<'a> BitAndAssign<&'a BitSet> for BitSet {
192 #[inline]
193 fn bitand_assign(&mut self, rhs: &'a Self) {
194 for (l, r) in self.bits.iter_mut().zip(rhs.bits.iter()) {
195 *l &= *r;
196 }
197 }
198}
199impl<'a> BitAnd<&'a BitSet> for BitSet {
200 type Output = Self;
201 #[inline]
202 fn bitand(mut self, rhs: &'a Self) -> Self::Output {
203 self &= rhs;
204 self
205 }
206}
207impl<'b> BitAnd<&'b BitSet> for &BitSet {
208 type Output = BitSet;
209 #[inline]
210 fn bitand(self, rhs: &'b BitSet) -> Self::Output {
211 let mut res = self.clone();
212 res &= rhs;
213 res
214 }
215}
216impl<'a> BitXorAssign<&'a BitSet> for BitSet {
217 #[inline]
218 fn bitxor_assign(&mut self, rhs: &'a Self) {
219 for (l, r) in self.bits.iter_mut().zip(rhs.bits.iter()) {
220 *l ^= *r;
221 }
222 self.trim();
223 }
224}
225impl<'a> BitXor<&'a BitSet> for BitSet {
226 type Output = Self;
227 #[inline]
228 fn bitxor(mut self, rhs: &'a Self) -> Self::Output {
229 self ^= rhs;
230 self
231 }
232}
233impl<'b> BitXor<&'b BitSet> for &BitSet {
234 type Output = BitSet;
235 #[inline]
236 fn bitxor(self, rhs: &'b BitSet) -> Self::Output {
237 let mut res = self.clone();
238 res ^= rhs;
239 res
240 }
241}
242impl Not for BitSet {
243 type Output = Self;
244 #[inline]
245 fn not(mut self) -> Self::Output {
246 for x in self.bits.iter_mut() {
247 *x = !*x;
248 }
249 self.trim();
250 self
251 }
252}
253impl Not for &BitSet {
254 type Output = BitSet;
255 #[inline]
256 fn not(self) -> Self::Output {
257 !self.clone()
258 }
259}