Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int type_size_bits = 6;
- int type_size = 1 << type_size_bits;
- int lastBits = (1 << type_size_bits) - 1;
- class MyBitset {
- long[] a;
- int bucketCount;
- MyBitset(int size) {
- if ((size & lastBits) != 0) size += lastBits;
- bucketCount = size >> type_size_bits;
- a = new long[bucketCount];
- }
- void set(int at) {
- a[at >> type_size_bits] |= 1L << (at & lastBits);
- }
- boolean get(int at) {
- long res = a[at >> type_size_bits] & (1L << (at & lastBits));
- return res != 0;
- }
- MyBitset get(int l, int r) {
- int size = r - l + 1;
- MyBitset res = new MyBitset(size);
- int startBucket = l >> type_size_bits;
- int endBucket = r >> type_size_bits;
- if (startBucket == endBucket) {
- for (int i = l; i <= r; i++) {
- if (get(i)) {
- res.set(i - l);
- }
- }
- return res;
- }
- int cutBits = 0;
- if ((l & lastBits) != 0) {
- for (int i = l; (i & lastBits) != 0; i++) {
- if (get(i)) {
- res.set(i - l);
- }
- cutBits++;
- }
- startBucket++;
- }
- if ((r & lastBits) != lastBits) {
- for (int i = r; (i & lastBits) != lastBits; i--) {
- if (get(i)) {
- res.set(i - l);
- }
- }
- endBucket--;
- }
- for (int i = startBucket; i <= endBucket; i++) {
- int bucket0 = i - startBucket;
- long cur = a[i];
- if (cutBits == 0) {
- res.a[bucket0] = cur;
- continue;
- }
- long head = cur & ((1L << (type_size - cutBits)) - 1);
- long tail = cur ^ head;
- res.a[bucket0] |= head << cutBits;
- res.a[bucket0 + 1] |= tail >>> (type_size - cutBits);
- }
- return res;
- }
- void makeOr(MyBitset other) {
- for (int i = 0; i < other.bucketCount; i++) {
- a[i] |= other.a[i];
- }
- }
- @Override
- public String toString() {
- String s = "";
- for (int i = 0; i < bucketCount; i++) {
- for (int j = 0; j < type_size; j++) {
- if (((a[i] >> j) & 1) == 1) {
- s += (i * type_size + j) + " ";
- }
- }
- }
- return s;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement