#6537. 毒瘤题加强版再加强版(hash)

用模数存对应位置的hash = A × x + B =A\times x+B =A×x+B值,为了防止hash冲突,多取几个模数,最后 ( m o d A ) = B \pmod{A}=B (modA)=B 的就是出现奇数且没有冲突的。

3 M B = 2 20 × 3 3MB=2^{20}\times 3 3MB=220×3

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int M=6,mod[M]={24593,23627,22959,25543,29881,29873}, A = 805306457, B = 402653189;
int n,k;
LL f[M][30005];
vector<int>ans;
int main()
{
	scanf("%d%d",&n,&k);
	for(int i=1,x;i<=n;i++){
		scanf("%d",&x);LL H=1LL*A*x+B;
		for(int j=0;j<M;j++) f[j][x%mod[j]]^=H;
	}
	for(int i=0;i<M;i++) for(int j=0;j<mod[i];j++) if(f[i][j]%A==B) ans.push_back((f[i][j]-B)/A);
	sort(ans.begin(),ans.end()),unique(ans.begin(),ans.end());
	for(int i=0;i<k;i++) printf("%d\n",ans[i]);
}