#ifndef SEMI_BITSET_HPP #define SEMI_BITSET_HPP #include #include #include #include using std::size_t; static const size_t dynamic = std::numeric_limits::max(); static const std::uint64_t lower_half = 0x00000000FFFFFFFF; template struct semi_bitset{ using uint64_t = std::uint64_t; using uint32_t = std::uint32_t; size_t size = size_; inline size_t length(){return size;} uint64_t data[size_] = {0}; inline semi_bitset(size_t s){} inline uint64_t chunk(size_t i){ return data[i]; } }; template<> struct semi_bitset{ using uint64_t = std::uint64_t; using uint32_t = std::uint32_t; size_t size; std::vector data; inline semi_bitset(size_t _size) : size(_size), data(size, 0){} inline size_t length(){return size;}; inline uint64_t chunk(size_t i){ return data[i]; } }; /*template inline semi_bitset operator<<(const semi_bitset& set, int o)const{ if(o < 0){return this->operator>>(-o);} if(o == 0){return *this;} semi_bitset ret; unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = jump;i < size;i++){ if(i < (size - 1)) ret.data[i - jump] = ((data[i] << mod) & lower_half) | (data[i + 1] >> counter); else ret.data[i - jump] = ((data[i] << mod) & lower_half); } return ret; } */ /*template struct semi_bitset{ using uint64_t = std::uint64_t; using uint32_t = std::uint32_t; std::vector data; inline semi_bitset() : data(size, 0){} inline size_t length()const{ return size; } inline semi_bitset operator<<(int o)const{ if(o < 0){return this->operator>>(-o);} if(o == 0){return *this;} semi_bitset ret; unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = jump;i < size;i++){ if(i < (size - 1)) ret.data[i - jump] = ((data[i] << mod) & lower_half) | (data[i + 1] >> counter); else ret.data[i - jump] = ((data[i] << mod) & lower_half); } return ret; } inline semi_bitset operator>>(int o)const{ if(o < 0){return this->operator<<(-o);} if(o == 0){return *this;} semi_bitset ret; unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = jump;i < size;i++){ if(i > jump) ret.data[i] = (data[i - jump] >> mod) | ((data[i - jump - 1] << counter) & lower_half); else ret.data[i] = (data[i - jump] >> mod); } return ret; } inline semi_bitset& operator<<=(int o){ if(o < 0){return this->operator>>=(-o);} if(o == 0){return *this;} unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = jump;i < size;i++){ if(i < (size - 1)) data[i - jump] = ((data[i] << mod) & lower_half) | (data[i + 1] >> counter); else data[i - jump] = ((data[i] << mod) & lower_half); } for(size_t i = size - jump;i < size;i++){ data[i] = 0; } return *this; } inline semi_bitset& operator>>=(int o){ if(o < 0){return this->operator<<=(-o);} if(o == 0){return *this;} unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = size - 1;i >= jump;i--){ if(i > jump) data[i] = (data[i - jump] >> mod) | ((data[i - jump - 1] << counter) & lower_half); else data[i] = (data[i - jump] >> mod); } if(jump > 0) for(size_t i = jump - 1;i >= 0;i--){ data[i] = 0; if(i == 0)break; } return *this; } template inline semi_bitset operator&(const semi_bitset& o)const{ static_assert(size == osize); semi_bitset ret; for(size_t i = 0;i < size;i++){ ret.data[i] = (data[i] & o.data[i]); } return ret; } template inline semi_bitset operator^(const semi_bitset& o)const{ static_assert(size == osize); semi_bitset ret; for(size_t i = 0;i < size;i++){ ret.data[i] = (data[i] ^ o.data[i]); } return ret; } template inline semi_bitset operator|(const semi_bitset& o)const{ static_assert(size == osize); semi_bitset ret; for(size_t i = 0;i < size;i++){ ret.data[i] = (data[i] | o.data[i]); } return ret; } template inline semi_bitset& operator&=(const semi_bitset& o){ static_assert(size == osize); for(size_t i = 0;i < size;i++){ data &= o.data[i]; } return *this; } template inline semi_bitset& operator^=(const semi_bitset& o){ static_assert(size == osize); for(size_t i = 0;i < size;i++){ data ^= o.data[i]; } return *this; } template inline semi_bitset& operator|=(const semi_bitset& o){ static_assert(size == osize); for(size_t i = 0;i < size;i++){ data |= o.data[i]; } return *this; } template inline friend stream& operator<<(stream& s, const semi_bitset& o){ for(size_t i = 0;i < o.data.size();i++) s << std::bitset<32>((uint32_t)(o.data[i] & lower_half)); return s; } }; template struct semi_bitset{ using uint64_t = std::uint64_t; using uint32_t = std::uint32_t; uint64_t data[size] = {0}; static const bool containertype = 0; inline semi_bitset operator<<(int o)const{ if(o < 0){return this->operator>>(-o);} if(o == 0){return *this;} semi_bitset ret; unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = jump;i < size;i++){ if(i < (size - 1)) ret.data[i - jump] = ((data[i] << mod) & lower_half) | (data[i + 1] >> counter); else ret.data[i - jump] = ((data[i] << mod) & lower_half); } return ret; } inline size_t length()const{ return size; } inline semi_bitset operator>>(int o)const{ if(o < 0){return this->operator<<(-o);} if(o == 0){return *this;} semi_bitset ret; unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = jump;i < size;i++){ if(i > jump) ret.data[i] = (data[i - jump] >> mod) | ((data[i - jump - 1] << counter) & lower_half); else ret.data[i] = (data[i - jump] >> mod); } return ret; } inline semi_bitset& operator<<=(int o){ if(o < 0){return this->operator>>=(-o);} if(o == 0){return *this;} unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = jump;i < size;i++){ if(i < (size - 1)) data[i - jump] = ((data[i] << mod) & lower_half) | (data[i + 1] >> counter); else data[i - jump] = ((data[i] << mod) & lower_half); } for(size_t i = size - jump;i < size;i++){ data[i] = 0; } return *this; } inline semi_bitset& operator>>=(int o){ if(o < 0){return this->operator<<=(-o);} if(o == 0){return *this;} unsigned int jump = o / 32; unsigned int mod = o % 32; unsigned int counter = 32 - (o % 32); for(size_t i = size - 1;i >= jump;i--){ if(i > jump) data[i] = (data[i - jump] >> mod) | ((data[i - jump - 1] << counter) & lower_half); else data[i] = (data[i - jump] >> mod); } if(jump > 0) for(size_t i = jump - 1;i >= 0;i--){ data[i] = 0; if(i == 0)break; } return *this; } template inline semi_bitset operator&(const semi_bitset& o)const{ static_assert(size == osize); semi_bitset ret; for(size_t i = 0;i < size;i++){ ret.data[i] = (data[i] & o.data[i]); } return ret; } template inline semi_bitset operator^(const semi_bitset& o)const{ static_assert(size == osize); semi_bitset ret; for(size_t i = 0;i < size;i++){ ret.data[i] = (data[i] ^ o.data[i]); } return ret; } template inline semi_bitset operator|(const semi_bitset& o)const{ static_assert(size == osize); semi_bitset ret; for(size_t i = 0;i < size;i++){ ret.data[i] = (data[i] | o.data[i]); } return ret; } template inline semi_bitset& operator&=(const semi_bitset& o){ static_assert(size == osize); for(size_t i = 0;i < size;i++){ data &= o.data[i]; } return *this; } template inline semi_bitset& operator^=(const semi_bitset& o){ static_assert(size == osize); for(size_t i = 0;i < size;i++){ data ^= o.data[i]; } return *this; } template inline semi_bitset& operator|=(const semi_bitset& o){ static_assert(size == osize); for(size_t i = 0;i < size;i++){ data |= o.data[i]; } return *this; } };*/ #endif