답안 #932320

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
932320 2024-02-23T08:01:34 Z minhnhatnoe 앨리스, 밥, 서킷 (APIO23_abc) C++17
100 / 100
814 ms 549012 KB
#include "abc.h"
#include <bits/stdc++.h>
using namespace std;

const int NAME_SIZE = 19, NUM_SIZE = 16;

namespace rutils
{
    long long ensure_div(long long a, long long b)
    {
        assert(a % b == 0);
        return a / b;
    }
}

namespace alice_bob_helpers
{
    namespace string_encode
    {
        const int length_offset[5] = {0, 0, 26,
                                      26 + 26 * 26,
                                      26 + 26 * 26 + 26 * 26 * 26};
        int ctoi(const char *a)
        {
            int ptr = 0, result = 0;
            for (; a[ptr]; ptr++)
                result = result * 26 + a[ptr] - 'a';
            return result + length_offset[ptr];
        }
    }
    namespace permutation_encode
    {
        void sort_bits(vector<int> &a, vector<bool> &ops)
        {
            if (a.size() == 1)
                return;

            int pcnt = (a.size() + 1) / 2;

            // Step 1
            {
                vector<bool> vis(pcnt), pops(pcnt);
                // Start with padding's pair
                for (int i = pcnt - 1; i >= 0; i--)
                {
                    for (int ptr = i; !vis[ptr];)
                    {
                        vis[ptr] = true;
                        int csecond = ptr + pcnt != a.size() ? a[ptr + pcnt] : a.size(), nfirst;
                        if (csecond < pcnt)
                            nfirst = csecond + pcnt;
                        else
                            nfirst = csecond - pcnt;

                        int nfpos = find(a.begin(), a.end(), nfirst) - a.begin();
                        if (nfpos >= pcnt)
                        {
                            pops[nfpos - pcnt] = 1; // Cannot be padding's pair
                            swap(a[nfpos - pcnt], a[nfpos]);
                            ptr = nfpos - pcnt;
                        }
                        else
                            ptr = nfpos;
                    }
                }
                ops.insert(ops.end(), pops.begin(), pops.end());
            }

            // Step 2
            {
                vector<int> left(pcnt);
                for (int i = 0; i < left.size(); i++)
                    left[i] = a[i] % pcnt;
                sort_bits(left, ops);
                sort(a.begin(), a.begin() + left.size(), [&](int a, int b)
                     { return a % pcnt < b % pcnt; });

                vector<int> right(a.size() - pcnt);
                for (int i = 0; i < right.size(); i++)
                    right[i] = a[i + pcnt] % pcnt;
                sort_bits(right, ops);
                sort(a.begin() + left.size(), a.end(), [&](int a, int b)
                     { return a % pcnt < b % pcnt; });
            }

            // Step 3
            {
                vector<bool> pops(pcnt, 0);
                for (int i = 0; i < pcnt; i++)
                {
                    if (i + pcnt != a.size() && a[i] > a[i + pcnt])
                    {
                        swap(a[i], a[i + pcnt]);
                        pops[i] = 1;
                    }
                }
                ops.insert(ops.end(), pops.begin(), pops.end());
            }
            assert(is_sorted(a.begin(), a.end()));
        }

        template <typename T>
        vector<bool> sorted_to_permutation(vector<T> a)
        {
            if (a.size() == 0) return {};

            vector<pair<T, int>> x(a.size());
            for (int i=0; i<a.size(); i++) x[i] = {a[i], i};
            sort(x.begin(), x.end());

            vector<int> p(x.size());
            for (int i=0; i<x.size(); i++) p[i] = x[i].second;

            vector<bool> result;
            sort_bits(p, result);

            assert(result.size() <= a.size() * 12);
            result.resize(a.size() * 12);

            return result;
        }
    }
}

namespace circuit_helpers
{
    namespace numbers
    {
        enum BIT_OP
        {
            OP_ZERO,        // f(OP_ZERO,    x0, x1) = 0
            OP_NOR,         // f(OP_NOR,     x0, x1) = !(x0 || x1)
            OP_GREATER,     // f(OP_GREATER, x0, x1) = (x0 > x1)
            OP_NOT_X1,      // f(OP_NOT_X1,  x0, x1) = !x1
            OP_LESS,        // f(OP_LESS,    x0, x1) = (x0 < x1)
            OP_NOT_X0,      // f(OP_NOT_X0,  x0, x1) = !x0
            OP_XOR,         // f(OP_XOR,     x0, x1) = (x0 ^ x1)
            OP_NAND,        // f(OP_NAND,    x0, x1) = !(x0 && x1)
            OP_AND,         // f(OP_AND,     x0, x1) = (x0 && x1)
            OP_EQUAL,       // f(OP_EQUAL,   x0, x1) = (x0 == x1)
            OP_X0,          // f(OP_X0,      x0, x1) = x0
            OP_GEQ,         // f(OP_GEQ,     x0, x1) = (x0 >= x1)
            OP_X1,          // f(OP_X1,      x0, x1) = x1
            OP_LEQ,         // f(OP_LEQ,     x0, x1) = (x0 <= x1)
            OP_OR,          // f(OP_OR,      x0, x1) = (x0 || x1)
            OP_ONE,         // f(OP_ONE,     x0, x1) = 1
            NOT_CONSTRUCTED // Input bits
        };
        struct bit
        {
            int v;
            bit() = delete;
            bit(int v) : v(v) {}
        };

        namespace io
        {
            int input_size = -1, input_ptr = 0;

            vector<pair<BIT_OP, pair<bit, bit>>> cstr;
            bit make_bit(BIT_OP op, bit x, bit y)
            {
                cstr.push_back({op, {x, y}});
                return cstr.size() - 1;
            }

            bit zero = -1, one = -1;
            void init(int isize)
            {
                input_size = isize;
                cstr.assign(isize, pair<BIT_OP, pair<bit, bit>>{NOT_CONSTRUCTED, {-1, -1}});
                zero = make_bit(OP_ZERO, 0, 0);
                one = make_bit(OP_ONE, 0, 0);
            }

            int write(int operation[], int operand[][2], int output[][NUM_SIZE], const vector<vector<bit>> &result)
            {
                assert(input_ptr == input_size);
                for (int i = input_size; i < cstr.size(); i++)
                {
                    operation[i] = cstr[i].first;
                    operand[i][0] = cstr[i].second.first.v;
                    operand[i][1] = cstr[i].second.second.v;
                }

                for (int i = 0; i < result.size(); i++)
                {
                    assert(result[i].size() == NUM_SIZE);
                    for (int j = 0; j < NUM_SIZE; j++)
                        output[i][j] = result[i][j].v;
                }
                return cstr.size();
            }
        }

#define DEF_BIT_OP(op, name) \
    bit operator op(const bit &a, const bit &b) { return io::make_bit(name, a, b); }
        DEF_BIT_OP(^, OP_XOR)
        DEF_BIT_OP(&, OP_AND)
        DEF_BIT_OP(|, OP_OR)
        DEF_BIT_OP(==, OP_EQUAL)
        DEF_BIT_OP(<, OP_LESS)
        DEF_BIT_OP(>, OP_GREATER)
#undef DEF_BIT_OP

        bit blend(bit a, bit b, bit c)
        {
            return (a > c) | (b & c);
        }
        vector<bit> blend(vector<bit> a, vector<bit> b, bit c)
        {
            assert(a.size() == b.size());
            for (int i = 0; i < a.size(); i++)
                a[i] = blend(a[i], b[i], c);
            return a;
        }

        pair<bit, bit> swap_if(bit a, bit b, bit c)
        {
            c = c & (a ^ b);
            return {a ^ c, b ^ c};
        }
        pair<vector<bit>, vector<bit>> swap_if(vector<bit> a, vector<bit> b, bit c)
        {
            assert(a.size() == b.size());
            for (int i = 0; i < a.size(); i++)
                tie(a[i], b[i]) = swap_if(a[i], b[i], c);
            return {a, b};
        }

        bit operator<(vector<bit> lhs, vector<bit> rhs)
        {
            assert(lhs.size() == rhs.size());
            bit result(io::zero);
            for (int i = 0; i < lhs.size(); i++)
                result = blend(lhs[i] < rhs[i], result, lhs[i] == rhs[i]);
            return result;
        }

        vector<bit> operator&(vector<bit> a, bit b)
        {
            for (bit &x : a)
                x = x & b;
            return a;
        }

        vector<bit> operator+(vector<bit> l, vector<bit> r)
        {
            assert(l.size() == r.size());
            vector<bit> result(l.size(), io::zero);
            int ptr = 0;

            for (bit three = io::zero; ptr < l.size(); ptr++)
            {
                bit one = l[ptr], two = r[ptr];
                assert(one.v != -1 && two.v != -1);

                bit four = one ^ two;
                bit five = result[ptr] = four ^ three;
                bit six = one & two;
                bit seven = four & three;
                three = six | seven;
            }

            return result;
        }
    }
    namespace merge_sorted
    {
        template <int SIZE>
        vector<numbers::bit> name_bit_extract(const vector<numbers::bit> &a)
        {
            assert(a.size() == SIZE);
            vector<numbers::bit> result = {a.back()};
            for (int i = 0; i < NAME_SIZE; i++)
                result.push_back(a[i]);
            return result;
        };

        struct operation
        {
            int x, y;
            numbers::bit s;
        };

        template <int SIZE>
        void merge_name_bit(vector<vector<numbers::bit>> &a, vector<int> cset, vector<operation> &ops)
        {
            auto edge = [&](int x, int y)
            {
                x = cset[x], y = cset[y];
                numbers::bit s = name_bit_extract<SIZE>(a[y]) < name_bit_extract<SIZE>(a[x]);
                tie(a[x], a[y]) = numbers::swap_if(a[x], a[y], s);
                ops.push_back({x, y, s});
            };

            assert(cset.size() % 2 == 0);
            if (cset.size() == 2)
            {
                edge(0, 1);
                return;
            }

            vector<int> sset[2];
            for (int i = 0; i < cset.size(); i += 2)
            {
                sset[0].push_back(cset[i]);
                sset[1].push_back(cset[i + 1]);
            }

            merge_name_bit<SIZE>(a, sset[0], ops);
            merge_name_bit<SIZE>(a, sset[1], ops);

            for (int i = 2; i < cset.size(); i++)
                edge(i - 1, i);
        }

        template <int SIZE>
        vector<operation> merge_name_bit(vector<vector<numbers::bit>> &a)
        {
            vector<int> cset(a.size());
            iota(cset.begin(), cset.end(), 0);

            vector<operation> ops;
            merge_name_bit<SIZE>(a, cset, ops);

            return ops;
        }
        void undo_merge(vector<vector<numbers::bit>> &a, vector<operation> &ops)
        {
            while (ops.size())
            {
                operation cop = ops.back();
                ops.pop_back();
                tie(a[cop.x], a[cop.y]) = swap_if(a[cop.x], a[cop.y], cop.s);
            }
        }
    }
    namespace permutation_decode
    {
        void apply_permutation(vector<vector<numbers::bit>> &a, int l, int r, vector<numbers::bit>::iterator &opsit)
        {
            if (r - l + 1 == 1)
                return;
            int pcnt = (r - l + 1 + 1) / 2;

            // Step 1
            for (int i = 0; i < pcnt; i++){
                vector<numbers::bit> &x = a[l + i], &y = l + i + pcnt <= r ? a[l + i + pcnt] : a[l + i];
                tie(x, y) = numbers::swap_if(x, y, *(opsit++));
            }

            // Step 2
            apply_permutation(a, l, l + pcnt - 1, opsit);
            apply_permutation(a, l + pcnt, r, opsit);

            // Step 3
            for (int i = 0; i < pcnt; i++){
                vector<numbers::bit> &x = a[l + i], &y = l + i + pcnt <= r ? a[l + i + pcnt] : a[l + i];
                tie(x, y) = numbers::swap_if(x, y, *(opsit++));
            }
        }
    }
}

// Alice
int // returns la
alice(
    /*  in */ const int n,
    /*  in */ const char names[][5],
    /*  in */ const unsigned short numbers[],
    /* out */ bool outputs_alice[])
{
    vector<int> name(n);
    for (int i = 0; i < n; i++)
        name[i] = alice_bob_helpers::string_encode::ctoi(names[i]);

    vector<unsigned short> nums(n);
    copy(numbers, numbers + n, nums.begin());

    vector<pair<int, unsigned short>> a(n);
    for (int i = 0; i < a.size(); i++)
        a[i] = {name[i], nums[i]};
    sort(a.begin(), a.end());

    vector<bool> xandn;
    for (pair<int, unsigned short> &v : a)
    {
        for (int i = 0; i < NAME_SIZE; i++)
            xandn.push_back(v.first & (1 << i));
        for (int i = 0; i < NUM_SIZE; i++)
            xandn.push_back(v.second & (1 << i));
    }

    vector<bool> p_xtoa = alice_bob_helpers::permutation_encode::sorted_to_permutation(name);

    return copy(p_xtoa.begin(), p_xtoa.end(), copy(xandn.begin(), xandn.end(), outputs_alice)) - outputs_alice;
}

// Bob
int // returns lb
bob(
    /*  in */ const int m,
    /*  in */ const char senders[][5],
    /*  in */ const char recipients[][5],
    /* out */ bool outputs_bob[])
{
    vector<pair<int, int>> msg(m);
    for (int i = 0; i < m; i++)
        msg[i] = {alice_bob_helpers::string_encode::ctoi(senders[i]),
                  alice_bob_helpers::string_encode::ctoi(recipients[i])};
    sort(msg.begin(), msg.end());

    vector<bool> xandy;
    for (pair<int, int> &v : msg)
    {
        for (int i = 0; i < NAME_SIZE; i++)
            xandy.push_back(v.first & (1 << i));
        for (int i = 0; i < NAME_SIZE; i++)
            xandy.push_back(v.second & (1 << i));
    }

    sort(msg.begin(), msg.end(), [](const pair<int, int> &a, const pair<int, int> &b)
         { return a.second < b.second; });
    
    vector<bool> p_xtoy = alice_bob_helpers::permutation_encode::sorted_to_permutation(msg);
    return copy(p_xtoy.begin(), p_xtoy.end(), copy(xandy.begin(), xandy.end(), outputs_bob)) - outputs_bob;
}

// Circuit
int // returns l
circuit(
    /*  in */ const int la,
    /*  in */ const int lb,
    /* out */ int operations[],
    /* out */ int operands[][2],
    /* out */ int outputs_circuit[][16])
{
    using namespace circuit_helpers;

    // Step 0: Input
    int n, m;
    vector<vector<numbers::bit>> a, b;
    vector<numbers::bit> p_xtoa, p_xtoy;
    {
        namespace io = numbers::io;
        io::init(la + lb);

        // Step 0.1: Input from Alice
        n = rutils::ensure_div(la, NAME_SIZE + NUM_SIZE + 12);
        a.resize(n);
        for (int i = 0; i < n; i++)
        {
            for (; a[i].size() < NAME_SIZE; a[i].push_back(io::input_ptr++))
                ;
            for (; a[i].size() < NAME_SIZE + NUM_SIZE; a[i].push_back(io::input_ptr++))
                ;
            for (; a[i].size() < NAME_SIZE + NAME_SIZE; a[i].push_back(io::zero))
                ;
            a[i].push_back(io::zero);
        }
        for (int i = 0; i < n * 12; i++)
            p_xtoa.push_back(io::input_ptr++);

        // Step 0.2: Input from Bob
        m = rutils::ensure_div(lb, NAME_SIZE + NAME_SIZE + 12);
        b.resize(m);
        for (int i = 0; i < m; i++)
        {
            for (; b[i].size() < NAME_SIZE; b[i].push_back(io::input_ptr++))
                ;
            for (; b[i].size() < NAME_SIZE + NAME_SIZE; b[i].push_back(io::input_ptr++))
                ;
            b[i].push_back(io::one);
        }
        for (int i = 0; i < m * 12; i++)
            p_xtoy.push_back(io::input_ptr++);

        assert(io::input_ptr == io::input_size);
    }

    // Step 1: Merge sorted arrays of <X, N, 0> and <X, Y, 1> by <1, 3>
    int absize;
    vector<vector<numbers::bit>> c;
    vector<merge_sorted::operation> merge_ops;
    {
        for (absize = 1; absize < a.size() || absize < b.size(); absize <<= 1)
            ;
        for (; a.size() < absize; a.emplace_back(NAME_SIZE + NAME_SIZE + 1, numbers::io::one))
            ;
        for (; b.size() < absize; b.emplace_back(NAME_SIZE + NAME_SIZE + 1, numbers::io::one))
            ;

        c.resize(absize * 2);
        copy(b.begin(), b.end(), copy(a.begin(), a.end(), c.begin()));

        merge_ops = merge_sorted::merge_name_bit<NAME_SIZE + NAME_SIZE + 1>(c);
    }

    // Step 2: Forward pass.
    // <X, N, 0> -> <X, 0, 0>.
    // <X, Y, 1> -> <Y, N, 1>
    {
        vector<numbers::bit> v(NUM_SIZE, numbers::io::zero);
        for (int i = 0; i < n + m; i++)
        {
            vector<numbers::bit> f(c[i].begin(), c[i].begin() + NAME_SIZE),
                s(c[i].begin() + NAME_SIZE, c[i].begin() + NAME_SIZE * 2);
            numbers::bit t = c[i].back();

            vector<numbers::bit> nf = numbers::blend(f, s, t);
            vector<numbers::bit> ns = numbers::blend(vector<numbers::bit>(NUM_SIZE, numbers::io::zero), v, t);
            v = numbers::blend({s.begin(), s.begin() + NUM_SIZE}, v, t);

            vector<numbers::bit> result = nf;
            result.insert(result.end(), ns.begin(), ns.end());
            result.push_back(t);
            c[i] = result;
        }
        for (int i = n + m; i < c.size(); i++)
            c[i] = vector<numbers::bit>(NAME_SIZE + NUM_SIZE + 1, numbers::io::one);
    }

    // Step 3: Undo step 1
    {
        merge_sorted::undo_merge(c, merge_ops);

        a.resize(n);
        copy(c.begin(), c.begin() + n, a.begin());

        b.resize(m);
        copy(c.begin() + absize, c.begin() + absize + m, b.begin());
    }

    // Step 4: Permute b to sort by Y
    {
        vector<numbers::bit>::iterator it = p_xtoy.begin();
        if (b.size())
            circuit_helpers::permutation_decode::apply_permutation(b, 0, b.size() - 1, it);
    }


    // Step 5: Merge sorted arrays of <X, 0, 0> and <Y, N, 1> by <1, 3>
    {
        for (; a.size() < absize; a.emplace_back(NAME_SIZE + NUM_SIZE + 1, numbers::io::one))
            ;
        for (; b.size() < absize; b.emplace_back(NAME_SIZE + NUM_SIZE + 1, numbers::io::one))
            ;

        c.resize(absize * 2);
        copy(b.begin(), b.end(), copy(a.begin(), a.end(), c.begin()));

        merge_ops = merge_sorted::merge_name_bit<NAME_SIZE + NUM_SIZE + 1>(c);
    }

    // Step 6: Backward pass.
    {
        vector<numbers::bit> v(NUM_SIZE, numbers::io::zero);
        for (int i = c.size() - 1; i >= n + m; i--)
            c[i] = vector<numbers::bit>(NUM_SIZE, numbers::io::one);

        for (int i = n + m - 1; i >= 0; i--)
        {
            vector<numbers::bit> x(c[i].begin() + NAME_SIZE, c[i].begin() + NAME_SIZE + NUM_SIZE);
            numbers::bit t = c[i].back();
            v = c[i] = x + v;
            v = blend(vector<numbers::bit>(NUM_SIZE, numbers::io::zero), v, t);
        }
    }

    // Step 7: Undo step 5
    {
        merge_sorted::undo_merge(c, merge_ops);
        a.resize(n);
        copy(c.begin(), c.begin() + n, a.begin());
    }

    // Step 8: Permute a to sort by A
    {
        vector<numbers::bit>::iterator it = p_xtoa.begin();
        permutation_decode::apply_permutation(a, 0, a.size() - 1, it);
    }
    return numbers::io::write(operations, operands, outputs_circuit, a);
}

Compilation message

abc.cpp: In function 'void alice_bob_helpers::permutation_encode::sort_bits(std::vector<int>&, std::vector<bool>&)':
abc.cpp:49:50: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |                         int csecond = ptr + pcnt != a.size() ? a[ptr + pcnt] : a.size(), nfirst;
      |                                       ~~~~~~~~~~~^~~~~~~~~~~
abc.cpp:72:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |                 for (int i = 0; i < left.size(); i++)
      |                                 ~~^~~~~~~~~~~~~
abc.cpp:79:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   79 |                 for (int i = 0; i < right.size(); i++)
      |                                 ~~^~~~~~~~~~~~~~
abc.cpp:91:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |                     if (i + pcnt != a.size() && a[i] > a[i + pcnt])
      |                         ~~~~~~~~~^~~~~~~~~~~
abc.cpp: In function 'int circuit_helpers::numbers::io::write(int*, int (*)[2], int (*)[16], const std::vector<std::vector<circuit_helpers::numbers::bit> >&)':
abc.cpp:179:44: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<circuit_helpers::numbers::BIT_OP, std::pair<circuit_helpers::numbers::bit, circuit_helpers::numbers::bit> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  179 |                 for (int i = input_size; i < cstr.size(); i++)
      |                                          ~~^~~~~~~~~~~~~
abc.cpp:186:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  186 |                 for (int i = 0; i < result.size(); i++)
      |                                 ~~^~~~~~~~~~~~~~~
abc.cpp: In function 'std::vector<circuit_helpers::numbers::bit> circuit_helpers::numbers::blend(std::vector<circuit_helpers::numbers::bit>, std::vector<circuit_helpers::numbers::bit>, circuit_helpers::numbers::bit)':
abc.cpp:213:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<circuit_helpers::numbers::bit>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  213 |             for (int i = 0; i < a.size(); i++)
      |                             ~~^~~~~~~~~~
abc.cpp: In function 'std::pair<std::vector<circuit_helpers::numbers::bit>, std::vector<circuit_helpers::numbers::bit> > circuit_helpers::numbers::swap_if(std::vector<circuit_helpers::numbers::bit>, std::vector<circuit_helpers::numbers::bit>, circuit_helpers::numbers::bit)':
abc.cpp:226:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<circuit_helpers::numbers::bit>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  226 |             for (int i = 0; i < a.size(); i++)
      |                             ~~^~~~~~~~~~
abc.cpp: In function 'circuit_helpers::numbers::bit circuit_helpers::numbers::operator<(std::vector<circuit_helpers::numbers::bit>, std::vector<circuit_helpers::numbers::bit>)':
abc.cpp:235:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<circuit_helpers::numbers::bit>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  235 |             for (int i = 0; i < lhs.size(); i++)
      |                             ~~^~~~~~~~~~~~
abc.cpp: In function 'std::vector<circuit_helpers::numbers::bit> circuit_helpers::numbers::operator+(std::vector<circuit_helpers::numbers::bit>, std::vector<circuit_helpers::numbers::bit>)':
abc.cpp:253:44: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<circuit_helpers::numbers::bit>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  253 |             for (bit three = io::zero; ptr < l.size(); ptr++)
      |                                        ~~~~^~~~~~~~~~
abc.cpp:259:21: warning: variable 'five' set but not used [-Wunused-but-set-variable]
  259 |                 bit five = result[ptr] = four ^ three;
      |                     ^~~~
abc.cpp: In function 'int alice(int, const char (*)[5], const short unsigned int*, bool*)':
abc.cpp:382:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, short unsigned int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  382 |     for (int i = 0; i < a.size(); i++)
      |                     ~~^~~~~~~~~~
abc.cpp: In function 'int circuit(int, int, int*, int (*)[2], int (*)[16])':
abc.cpp:487:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  487 |         for (absize = 1; absize < a.size() || absize < b.size(); absize <<= 1)
      |                          ~~~~~~~^~~~~~~~~~
abc.cpp:487:54: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  487 |         for (absize = 1; absize < a.size() || absize < b.size(); absize <<= 1)
      |                                               ~~~~~~~^~~~~~~~~~
abc.cpp:489:25: warning: comparison of integer expressions of different signedness: 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  489 |         for (; a.size() < absize; a.emplace_back(NAME_SIZE + NAME_SIZE + 1, numbers::io::one))
      |                ~~~~~~~~~^~~~~~~~
abc.cpp:491:25: warning: comparison of integer expressions of different signedness: 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  491 |         for (; b.size() < absize; b.emplace_back(NAME_SIZE + NAME_SIZE + 1, numbers::io::one))
      |                ~~~~~~~~~^~~~~~~~
abc.cpp:520:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  520 |         for (int i = n + m; i < c.size(); i++)
      |                             ~~^~~~~~~~~~
abc.cpp:545:25: warning: comparison of integer expressions of different signedness: 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  545 |         for (; a.size() < absize; a.emplace_back(NAME_SIZE + NUM_SIZE + 1, numbers::io::one))
      |                ~~~~~~~~~^~~~~~~~
abc.cpp:547:25: warning: comparison of integer expressions of different signedness: 'std::vector<std::vector<circuit_helpers::numbers::bit> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  547 |         for (; b.size() < absize; b.emplace_back(NAME_SIZE + NUM_SIZE + 1, numbers::io::one))
      |                ~~~~~~~~~^~~~~~~~
abc.cpp: In instantiation of 'std::vector<bool> alice_bob_helpers::permutation_encode::sorted_to_permutation(std::vector<_Tp>) [with T = int]':
abc.cpp:395:92:   required from here
abc.cpp:108:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |             for (int i=0; i<a.size(); i++) x[i] = {a[i], i};
      |                           ~^~~~~~~~~
abc.cpp:112:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |             for (int i=0; i<x.size(); i++) p[i] = x[i].second;
      |                           ~^~~~~~~~~
abc.cpp: In instantiation of 'std::vector<bool> alice_bob_helpers::permutation_encode::sorted_to_permutation(std::vector<_Tp>) [with T = std::pair<int, int>]':
abc.cpp:426:91:   required from here
abc.cpp:108:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |             for (int i=0; i<a.size(); i++) x[i] = {a[i], i};
      |                           ~^~~~~~~~~
abc.cpp:112:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int>, std::allocator<std::pair<std::pair<int, int>, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |             for (int i=0; i<x.size(); i++) p[i] = x[i].second;
      |                           ~^~~~~~~~~
abc.cpp: In instantiation of 'void circuit_helpers::merge_sorted::merge_name_bit(std::vector<std::vector<circuit_helpers::numbers::bit> >&, std::vector<int>, std::vector<circuit_helpers::merge_sorted::operation>&) [with int SIZE = 39]':
abc.cpp:325:33:   required from 'std::vector<circuit_helpers::merge_sorted::operation> circuit_helpers::merge_sorted::merge_name_bit(std::vector<std::vector<circuit_helpers::numbers::bit> >&) [with int SIZE = 39]'
abc.cpp:497:78:   required from here
abc.cpp:305:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  305 |             for (int i = 0; i < cset.size(); i += 2)
      |                             ~~^~~~~~~~~~~~~
abc.cpp:314:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  314 |             for (int i = 2; i < cset.size(); i++)
      |                             ~~^~~~~~~~~~~~~
abc.cpp: In instantiation of 'void circuit_helpers::merge_sorted::merge_name_bit(std::vector<std::vector<circuit_helpers::numbers::bit> >&, std::vector<int>, std::vector<circuit_helpers::merge_sorted::operation>&) [with int SIZE = 36]':
abc.cpp:325:33:   required from 'std::vector<circuit_helpers::merge_sorted::operation> circuit_helpers::merge_sorted::merge_name_bit(std::vector<std::vector<circuit_helpers::numbers::bit> >&) [with int SIZE = 36]'
abc.cpp:553:77:   required from here
abc.cpp:305:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  305 |             for (int i = 0; i < cset.size(); i += 2)
      |                             ~~^~~~~~~~~~~~~
abc.cpp:314:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  314 |             for (int i = 2; i < cset.size(); i++)
      |                             ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1228 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1228 KB Correct!
2 Correct 1 ms 1208 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1228 KB Correct!
2 Correct 1 ms 1208 KB Correct!
3 Correct 644 ms 509260 KB Correct!
4 Correct 595 ms 512136 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 9800 KB Correct!
2 Correct 506 ms 474016 KB Correct!
3 Correct 504 ms 485300 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 9800 KB Correct!
2 Correct 506 ms 474016 KB Correct!
3 Correct 504 ms 485300 KB Correct!
4 Correct 521 ms 472240 KB Correct!
5 Correct 527 ms 487908 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 9800 KB Correct!
2 Correct 506 ms 474016 KB Correct!
3 Correct 504 ms 485300 KB Correct!
4 Correct 521 ms 472240 KB Correct!
5 Correct 527 ms 487908 KB Correct!
6 Correct 280 ms 228240 KB Correct!
7 Correct 605 ms 504768 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 786 ms 545900 KB Correct!
2 Correct 760 ms 545860 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 786 ms 545900 KB Correct!
2 Correct 760 ms 545860 KB Correct!
3 Correct 769 ms 537380 KB Correct!
4 Correct 800 ms 545604 KB Correct!
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1228 KB Correct!
2 Correct 1 ms 1208 KB Correct!
3 Correct 644 ms 509260 KB Correct!
4 Correct 595 ms 512136 KB Correct!
5 Correct 16 ms 9800 KB Correct!
6 Correct 506 ms 474016 KB Correct!
7 Correct 504 ms 485300 KB Correct!
8 Correct 521 ms 472240 KB Correct!
9 Correct 527 ms 487908 KB Correct!
10 Correct 280 ms 228240 KB Correct!
11 Correct 605 ms 504768 KB Correct!
12 Correct 786 ms 545900 KB Correct!
13 Correct 760 ms 545860 KB Correct!
14 Correct 769 ms 537380 KB Correct!
15 Correct 800 ms 545604 KB Correct!
16 Correct 814 ms 547708 KB Correct!
17 Correct 807 ms 549012 KB Correct!