1. 程式人生 > >JZOJ 5258. 友好數對

JZOJ 5258. 友好數對

Description

Description

Input

Input

Output

Output

Sample Input

3 5
1 8 13
7 5 4 8 3

Sample Output

7

Data Constraint

Data Constraint

Hint

Hint

Solution

題目大意

60分做法

80分做法

100分做法

Code

#include<cstdio>
using namespace std;
const int mo=1e7+7;
long long ans;
int h[mo],g[mo],t[mo],f[mo],p[31];
inline int read()
{
    int X=0,w=1
; char ch=0; while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();} while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar(); return X*w; } inline int hash(int x) { int y=x%mo; while(h[y] && h[y]!=x) y=y%mo+1; return y; } inline int hash1(int
x) { int y=x%mo; while(g[y] && g[y]!=x) y=y%mo+1; return y; } int main() { int n=read(),m=read(); for(int i=p[0]=1;i<=30;i++) p[i]=p[i-1]<<1; for(int i=1;i<=n;i++) { int x=read(),k=hash1(x); if(!g[k]) g[k]=x; t[k]++; for(int
j=0;j<30;j++) { int y=x^p[j]; k=hash(y); if(!h[k]) h[k]=y; f[k]++; } } for(int i=1;i<=m;i++) { int x=read(),k1=hash1(x); for(int j=0;j<30;j++) { int k=hash(x^p[j]); ans+=f[k]-t[k1]; } } printf("%lld",ans>>1); return 0; }