Asa's CP Library

a01sa01to's competitive programming library. Requires C++20 or higher with GCC. This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub a01sa01to/cp-library

:heavy_check_mark: tests/data-structure/dynamic-bitset/itp2-10b.test.cpp

Depends on

Code

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
using ll = long long;
using ull = unsigned long long;

#include "../../../library/data-structure/dynamic-bitset.hpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/lesson/8/ITP2/10/ITP2_10_B"

int main() {
  unsigned int _x, _y;
  cin >> _x >> _y;
  asalib::ds::DynamicBitset x(32, _x), y(32, _y);
  cout << (x & y).to_string() << '\n';
  cout << (x | y).to_string() << '\n';
  cout << (x ^ y).to_string() << '\n';
  return 0;
}
#line 1 "tests/data-structure/dynamic-bitset/itp2-10b.test.cpp"
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
using ll = long long;
using ull = unsigned long long;

#line 2 "library/data-structure/dynamic-bitset.hpp"

#line 4 "library/data-structure/dynamic-bitset.hpp"
#include <bit>
#include <concepts>
#line 11 "library/data-structure/dynamic-bitset.hpp"
using namespace std;

namespace asalib::ds {
  class DynamicBitset {
    private:
    using ull = uint64_t;
    size_t siz = 0;
    // TODO: valarray が constexpr に対応したら変える
    vector<ull> bits;

    public:
    constexpr explicit DynamicBitset() = default;
    constexpr DynamicBitset(const DynamicBitset&) = default;
    constexpr ~DynamicBitset() = default;
    constexpr DynamicBitset& operator=(const DynamicBitset&) = default;
    constexpr explicit DynamicBitset(const size_t size) {
      siz = size;
      bits.reserve((size + 63) >> 6);
      bits.resize((size + 63) >> 6, 0);
    }
    template<integral T>
    constexpr explicit DynamicBitset(const size_t size, const T value) {
      // TODO: ほかの型も考慮する
      static_assert(sizeof(T) <= sizeof(ull), "DynamicBitset: value type too large");
      siz = size;
      bits.reserve((size + 63) >> 6);
      bits.resize((size + 63) >> 6, 0);
      bits[0] = static_cast<ull>(value);
    }

    constexpr DynamicBitset& operator&=(const DynamicBitset& other) {
      const size_t s = min(bits.size(), other.bits.size());
      for (size_t i = 0; i < s; ++i) bits[i] &= other.bits[i];
      return *this;
    }
    constexpr DynamicBitset& operator|=(const DynamicBitset& other) {
      const size_t s = min(bits.size(), other.bits.size());
      for (size_t i = 0; i < s; ++i) bits[i] |= other.bits[i];
      return *this;
    }
    constexpr DynamicBitset& operator^=(const DynamicBitset& other) {
      const size_t s = min(bits.size(), other.bits.size());
      for (size_t i = 0; i < s; ++i) bits[i] ^= other.bits[i];
      return *this;
    }
    constexpr DynamicBitset& operator<<=(const size_t shift) {
      const size_t full = shift >> 6;
      const size_t rem = shift & 63;
      vector<ull> new_bits(bits.size(), 0);
      for (size_t i = 0; i < bits.size(); ++i) {
        if (i + full < new_bits.size()) {
          new_bits[i + full] |= bits[i] << rem;
          if (i + full + 1 < new_bits.size()) new_bits[i + full + 1] |= bits[i] >> (64 - rem);
        }
      }
      bits = std::move(new_bits);
      return *this;
    }
    constexpr DynamicBitset& operator>>=(const size_t shift) {
      const size_t full = shift >> 6;
      const size_t rem = shift & 63;
      vector<ull> new_bits(bits.size(), 0);
      for (size_t i = full; i < bits.size(); ++i) {
        new_bits[i - full] |= bits[i] >> rem;
        if (i - full - 1 < new_bits.size()) new_bits[i - full - 1] |= bits[i] << (64 - rem);
      }
      bits = std::move(new_bits);
      return *this;
    }
    constexpr DynamicBitset& set() {
      for (size_t i = 0; i < bits.size(); ++i) bits[i] = ~0ULL;
      return *this;
    }
    constexpr DynamicBitset& set(const size_t pos, const bool val = true) {
      if (pos >= siz) throw out_of_range("DynamicBitset::set: position out of range");
      const size_t idx = pos >> 6;
      const size_t bit = pos & 63;
      if (val)
        bits[idx] |= (1ULL << bit);
      else
        bits[idx] &= ~(1ULL << bit);
      return *this;
    }
    constexpr DynamicBitset& reset() {
      ranges::fill(bits, 0);
      return *this;
    }
    constexpr DynamicBitset& reset(size_t pos) { return set(pos, false); }
    constexpr DynamicBitset operator~() const {
      DynamicBitset res = *this;
      res.flip();
      return res;
    }
    constexpr DynamicBitset& flip() {
      for (size_t i = 0; i < bits.size(); ++i) bits[i] = ~bits[i];
      return *this;
    }
    constexpr DynamicBitset& flip(const size_t pos) {
      if (pos >= siz) throw out_of_range("DynamicBitset::flip: position out of range");
      const size_t idx = pos >> 6;
      const size_t bit = pos & 63;
      bits[idx] ^= (1ULL << bit);
      return *this;
    }

    constexpr size_t count() const {
      size_t cnt = 0;
      for (const ull& b : bits) cnt += popcount(b);
      return cnt;
    }
    constexpr size_t size() const { return siz; }
    constexpr bool test(const size_t pos) const {
      if (pos >= siz) throw out_of_range("DynamicBitset::test: position out of range");
      const size_t idx = pos >> 6;
      const size_t bit = pos & 63;
      return (bits[idx] >> bit) & 1;
    }
    constexpr bool all() const {
      for (const ull& b : bits)
        if (b != ~0ULL) return false;
      return true;
    }
    constexpr bool any() const {
      for (const ull& b : bits)
        if (b != 0) return true;
      return false;
    }
    constexpr bool none() const {
      for (const ull& b : bits)
        if (b != 0) return false;
      return true;
    }
    constexpr ull to_ull() const {
      if (bits.size() > 1) throw logic_error("DynamicBitset::to_ull: overflow");
      if (bits.empty()) return 0;
      return bits[0];
    }
    constexpr string to_string() const {
      string res;
      res.reserve(siz);
      for (size_t i = 0; i < siz; ++i) res += (test(i) ? '1' : '0');
      ranges::reverse(res);
      return res;
    }

    constexpr bool operator==(const DynamicBitset& other) const {
      if (siz != other.siz) return false;
      for (size_t i = 0; i < bits.size(); ++i)
        if (bits[i] != other.bits[i]) return false;
      return true;
    }
    constexpr bool operator!=(const DynamicBitset& other) const {
      return !(*this == other);
    }
    constexpr DynamicBitset operator<<(const size_t shift) const {
      DynamicBitset res = *this;
      res <<= shift;
      return res;
    }
    constexpr DynamicBitset operator>>(const size_t shift) const {
      DynamicBitset res = *this;
      res >>= shift;
      return res;
    }
    constexpr DynamicBitset operator&(const DynamicBitset& other) const {
      DynamicBitset res = *this;
      res &= other;
      return res;
    }
    constexpr DynamicBitset operator|(const DynamicBitset& other) const {
      DynamicBitset res = *this;
      res |= other;
      return res;
    }
    constexpr DynamicBitset operator^(const DynamicBitset& other) const {
      DynamicBitset res = *this;
      res ^= other;
      return res;
    }
  };
}  // namespace asalib::ds
#line 8 "tests/data-structure/dynamic-bitset/itp2-10b.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/lesson/8/ITP2/10/ITP2_10_B"

int main() {
  unsigned int _x, _y;
  cin >> _x >> _y;
  asalib::ds::DynamicBitset x(32, _x), y(32, _y);
  cout << (x & y).to_string() << '\n';
  cout << (x | y).to_string() << '\n';
  cout << (x ^ y).to_string() << '\n';
  return 0;
}
Back to top page