观察要求可知,(ai xor 2k) xor (bj xor 2l) = 0; (k ̸= l)。
对于每个ai,枚举哪位是1 加⼊哈希。对于每个bj,枚举哪位是
1,在哈希中查询个数。
最后,减去本来ai = bj 的情况后除以2。
假设哈希的时间复杂度为单次O(1),那么总时间复杂度
O(n log X)。
#include
#include
#include
#include
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MAXN=100005,MOD=10000019;
struct Edge{
int v,next,w;
}e[4000005];
int n,m,a[MAXN],b[MAXN],head[MOD],tot;
long long ans=0;
inline void add(int x)
{
int i,ha=x%MOD;
for(i=head[ha];~i;i=e[i].next){
if(e[i].v==x){
e[i].w++;
return;
}
}
e[tot].v=x;
e[tot].w=1;
e[tot].next=head[ha];
head[ha]=tot++;
}
inline int query(int x)
{
int i,ha=x%MOD;
for(i=head[ha];~i;i=e[i].next){
if(e[i].v==x){
return e[i].w;
}
}
return 0;
}
int main()
{
freopen("bipartite.in","r",stdin);
freopen("bipartite.out","w",stdout);
int i,j;
memset(head,-1,sizeof(head));
scanf("%d%d",&n,&m);
f(i,1,n){
scanf("%d",&a[i]);
add(a[i]);
}
f(i,1,m){
scanf("%d",&b[i]);
ans-=30*query(b[i]);
}
memset(head,-1,sizeof(head));
f(i,1,n){
f(j,0,29){
add(a[i]^(1<