#L3650. 「2021 集训队互测」子集匹配

    ID: 3306 传统题 1000ms 256MiB 尝试: 28 已通过: 0 难度: 10 上传者: 标签>图结构二分图其他构造位运算难度省选/NOI-贪心组合数学Catalan数列字符串哈希和哈希表

「2021 集训队互测」子集匹配

题目背景

小 P 本来想投个很有意思的改编题,但是它被原题做法直接爆过去了。

小 P 心态非常爆炸,于是他决定投一个简单题送温暖。

题目描述

小 P 学了 Hall 定理,感觉很有意思。

小 P 发现 Hall 定理的一个直接推论是,如果左部点集合 LL 的大小不超过右部点集合 RR 的大小,且左部点度数相等、右部点度数相等,且边集不为空,那么一定存在大小为 L|L| 的匹配。

小 P 发现 Hall 定理的一个问题是,它只给了存在性而没给构造。

小 P 随机了一道题,想让你帮他做:

给定 n,Kn, K ,保证 2K>n2K > n 。设 [n]={0,1,2,,n1}[n] = \{0, 1, 2, \cdots, n-1\} 。设 L\mathcal L 为所有 [n][n] 的大小为 KK 的子集组成的集合, R\mathcal R 为所有 [n][n] 的大小为 K1K-1 的子集组成的集合,并且对于 SL,TRS \in \mathcal L, T \in \mathcal RS,TS, T 之间有边当且仅当 TST \subset S 。请你求出一组大小为 L|\mathcal L| 的匹配。

为了减小 IO 所用时间,本题采用交互的形式评测。

请不要尝试 hack 交互库!

实现细节

你必须引用 hall.h 头文件。

你需要实现下面的过程:

int solve(int n, int K, int s);

其中 ss 表示一个 [n][n] 的子集 SSxSx \in S 当且仅当 ss 的二进制从低到高的第 xx 位为 11 。保证 S=K|S| = K 。你需要返回一个非负整数 tt ,以同样的格式表示集合 TT ,并满足 TS,T=K1T \subset S, |T| = K-1

solve 函数可能被调用多次,请注意变量的初始化。保证每次调用时给出的 n,Kn, K 都不变,且同一个 ss 只会被询问一次。

评测方式

样例评测库将读入如下格式的输入数据:

一行,两个正整数,表示 n,Kn, K

样例评测库将输出如下格式的输出数据:

设样例评测库调用了 qqsolve 函数,那么会输出 q+1q+1 行,第 ii(1iq)(1 \le i \le q) 形如 s -> t ,其中 s,ts, t 是由 0101 组成的长度为 nn 的字符串,表示 solve 函数的参数和返回值,从左到右依次为低位至高位。第 q+1q+1 行会输出 OKWA ,表示匹配是否合法。

样例

输入

5 3

输出

00111 -> 00101
01011 -> 00011
01101 -> 01100
01110 -> 01010
10011 -> 10010
10101 -> 10001
10110 -> 00110
11001 -> 01001
11010 -> 11000
11100 -> 10100
OK

数据范围与提示

保证 1n271 \le n \le 272K>n2K > n

  • 对于 20%20\% 的数据,保证 n15n \le 15
  • 对于 40%40\% 的数据,保证 n19n \le 19
  • 对于 60%60\% 的数据,保证 n23n \le 23
  • 对于 80%80\% 的数据,保证 n25n \le 25

请注意本题的空间限制。

保证交互库消耗时间不超过 0.3s\texttt{0.3s} ,消耗空间不超过 18MB\texttt{18MB} (其中包括 #include<bits/stdc++.h>using namespace std;)。