Luogu P10499 Solution
题面
在这里。
思路
\(1\le N\le 28\),考虑搜索。
将所有更改方式以及初始/结束状态压缩至一个 int
变量内。
直接搜索并不会被炸上天,在 C++20 O2
环境下用时 92ms。
代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, s, t, bt[N], x, y, trs, res;
void run()
{
res = 0;
scanf("%d", &n);
s = t = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &x);
s |= (x << i);
}
for (int i = 0; i < n; i++)
{
scanf("%d", &x);
t |= (x << i);
bt[i] = (1 << i);
}
while (scanf("%d%d", &x, &y), x or y)
{
bt[x - 1] |= (1 << (y - 1));
}
trs = (1 << n);
for (int i = 0, tp; i < trs; i++)
{
tp = s;
for (int j = 0; j < n; j++)
{
if (i & (1 << j))
tp ^= bt[j];
}
res += (tp == t);
}
if (res)
printf("%d\n", res);
else
puts("Oh,it's impossible~!!");
}
int main()
{
int T = 1;
scanf("%d", &T);
while (T--)
run();
}