如下代码无法通过样例,却AC了
#include <iostream>
#include <vector>
using namespace std;
const int N1 = 205, N2 = 3005;
int a[N1], b[N2];
int cnt[N2];
bool can[N2];
vector<int> g[N2], g1[N1];
int bf[N2], st[N2], Time;
int A, B, n, m;
inline bool check(int x)
{
int res = 0;
for (;x;x>>=1)
if (x & 1)
res ++;
return res & 1;
}
bool find(int u)
{
for (int j : g[u])
{
if (st[j] == Time || !can[j])
continue;
st[j] = Time;
if (!bf[j] || find(bf[j]))
{
bf[j] = u;
return true;
}
}
return false;
}
int match()
{
for (int i=1;i<=B;i++)
if (!(b[i] & 1) && can[i])
bf[i] = 0;
int res = 0;
for (int i=1;i<=B;i++)
if ((b[i] & 1) && can[i])
{
Time ++;
if (find(i))
res ++;
}
return n - res;
}
void work()
{
scanf("%d%d%d", &A, &B, &m);
for (int i=1;i<=A;i++)
scanf("%d", &a[i]);
for (int i=1;i<=B;i++)
scanf("%d", &b[i]);
for (int i=1;i<=B;i++)
if (b[i] & 1)
{
g[i].clear();
for (int j=1;j<=B;j++)
if (b[j] % 2 == 0 && check(b[i] | b[j]))
g[i].push_back(j);
}
for (int i=1;i<=B;i++)
can[i] = true;
while (m--)
{
int a, b;
scanf("%d%d", &a, &b);
g1[a].push_back(b);
}
n = B;
int ans = match();
for (int i=1;i<=A;i++)
{
for (int j=1;j<=B;j++)
can[j] = false;
for (int j : g1[i])
can[j] = true;
n = g1[i].size();
ans = max(ans, 1 + match());
}
for (int i=1;i<A;i++)
for (int j=i+1;j<=A;j++)
if ((a[i] ^ a[j]) & 1)
{
for (int k=1;k<=B;k++)
cnt[k] = 0;
for (int k : g1[i])
cnt[k] ++;
for (int k : g1[j])
cnt[k] ++;
n = 0;
for (int k=1;k<=B;k++)
if (cnt[k] == 2)
can[k] = true, n ++;
else
can[k] = false;
ans = max(ans, 2 + match());
}
printf("%d\n", ans);
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
work();
return 0;
}