Submission #66400307
Source Code Expand
// #define PROBLEM "https://atcoder.jp/contests/abc396/tasks/abc396_g"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/1/ITP1_1_A"
/*
* AtCoder Beginner Contest 396 - G Flip Row or Col
*
*/
#include <cstdint>
#include <cstddef>
namespace zawa {
using i16 = std::int16_t;
using i32 = std::int32_t;
using i64 = std::int64_t;
using i128 = __int128_t;
using u8 = std::uint8_t;
using u16 = std::uint16_t;
using u32 = std::uint32_t;
using u64 = std::uint64_t;
using usize = std::size_t;
} // namespace zawa
#include <bit>
#include <concepts>
#include <cassert>
#include <vector>
namespace zawa {
// note: 返り値の各点の値は真の値より(2^{k/2})倍されている
template <class T>
void FastWalshHadamardTransform(std::vector<T>& A) {
if (A.empty()) return;
while (!std::has_single_bit(A.size())) A.push_back(T{0});
const usize k = std::bit_width(A.size()) - 1, n = A.size();
for (usize i = 0 ; i < k ; i++) {
const usize bit = 1 << i;
for (usize j = 0 ; j < n ; j += bit << 1) {
for (usize k = 0 ; k < bit ; k++) {
const T p = A[j + k], q = A[j + k + bit];
A[j + k] = p + q;
A[j + k + bit] = p - q;
}
}
}
}
template <class T>
std::vector<T> BitwiseXORConvolution(std::vector<T> A, std::vector<T> B) {
FastWalshHadamardTransform(A);
FastWalshHadamardTransform(B);
if (A.size() > B.size()) std::swap(A, B);
for (usize i = 0 ; i < A.size() ; i++) A[i] *= B[i];
FastWalshHadamardTransform(A);
if (A.empty()) return A;
assert(std::has_single_bit(A.size()));
if constexpr (std::integral<T>) {
const usize d = std::bit_width(A.size()) - 1;
for (auto& a : A) a >>= d;
}
else {
const T d = [&]() {
assert(std::has_single_bit(A.size()));
usize exp = std::bit_width(A.size()) - 1;
T v = T{1} / T{2}, res = T{1};
while (exp) {
if (exp & 1) res = res * v;
v = v * v;
exp >>= 1;
}
return res;
}();
for (T& a : A) a *= d;
}
return A;
}
template <class T, class U>
requires (!std::same_as<T, U> and std::convertible_to<U, T>)
std::vector<T> BitwiseXORConvolution(std::vector<U> A, std::vector<U> B) {
std::vector<T> a(A.size()), b(B.size());
for (usize i = 0 ; i < A.size() ; i++) a[i] = static_cast<T>(std::move(A[i]));
for (usize i = 0 ; i < B.size() ; i++) b[i] = static_cast<T>(std::move(B[i]));
return BitwiseXORConvolution<T>(a, b);
}
} // namespace zawa
#include <algorithm>
#include <iostream>
#include <string>
#include <ranges>
int main() {
#ifdef ATCODER
std::cin.tie(nullptr);
std::cout.tie(nullptr);
std::ios::sync_with_stdio(false);
int H, W;
std::cin >> H >> W;
std::vector<int> A(1 << W), B(1 << W);
for (int i = 0 ; i < H ; i++) {
std::string S;
std::cin >> S;
int v = 0;
for (int j = 0 ; j < W ; j++) if (S[j] == '1') v |= 1 << j;
A[v]++;
}
for (int i = 0 ; i < (1 << W) ; i++) {
const int cnt = std::popcount((unsigned)i);
B[i] = std::min(cnt, W - cnt);
}
auto C = zawa::BitwiseXORConvolution<long long>(A, B);
std::cout << *std::ranges::min_element(C) << '\n';
#else
std::cout << "Hello World\n";
#endif
}
Submission Info
| Submission Time | |
|---|---|
| Task | G - Flip Row or Col |
| User | zawatin |
| Language | C++ 20 (gcc 12.2) |
| Score | 600 |
| Code Size | 3534 Byte |
| Status | AC |
| Exec Time | 44 ms |
| Memory | 15640 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 600 / 600 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
| All | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 00_sample_00.txt | AC | 1 ms | 3460 KiB |
| 00_sample_01.txt | AC | 1 ms | 3524 KiB |
| 00_sample_02.txt | AC | 1 ms | 3508 KiB |
| 01_test_00.txt | AC | 1 ms | 3528 KiB |
| 01_test_01.txt | AC | 1 ms | 3532 KiB |
| 01_test_02.txt | AC | 1 ms | 3504 KiB |
| 01_test_03.txt | AC | 7 ms | 3536 KiB |
| 01_test_04.txt | AC | 8 ms | 3528 KiB |
| 01_test_05.txt | AC | 10 ms | 3636 KiB |
| 01_test_06.txt | AC | 30 ms | 9220 KiB |
| 01_test_07.txt | AC | 39 ms | 15468 KiB |
| 01_test_08.txt | AC | 31 ms | 9176 KiB |
| 01_test_09.txt | AC | 43 ms | 15540 KiB |
| 01_test_10.txt | AC | 42 ms | 15536 KiB |
| 01_test_11.txt | AC | 44 ms | 15540 KiB |
| 01_test_12.txt | AC | 43 ms | 15640 KiB |
| 01_test_13.txt | AC | 42 ms | 15536 KiB |
| 01_test_14.txt | AC | 44 ms | 15504 KiB |
| 01_test_15.txt | AC | 20 ms | 9132 KiB |
| 01_test_16.txt | AC | 7 ms | 3516 KiB |
| 01_test_17.txt | AC | 8 ms | 3652 KiB |
| 01_test_18.txt | AC | 29 ms | 15640 KiB |
| 01_test_19.txt | AC | 28 ms | 15508 KiB |
| 01_test_20.txt | AC | 28 ms | 15424 KiB |
| 01_test_21.txt | AC | 28 ms | 15492 KiB |
| 01_test_22.txt | AC | 28 ms | 15500 KiB |
| 01_test_23.txt | AC | 29 ms | 15468 KiB |
| 01_test_24.txt | AC | 28 ms | 15640 KiB |
| 01_test_25.txt | AC | 29 ms | 15636 KiB |
| 01_test_26.txt | AC | 29 ms | 15552 KiB |
| 01_test_27.txt | AC | 1 ms | 3512 KiB |
| 01_test_28.txt | AC | 1 ms | 3648 KiB |
| 01_test_29.txt | AC | 8 ms | 3448 KiB |
| 01_test_30.txt | AC | 13 ms | 15496 KiB |
| 01_test_31.txt | AC | 28 ms | 15396 KiB |