为什么随机hash稳定在94pts-99pts
查看原帖
为什么随机hash稳定在94pts-99pts
341091
End_Sunset楼主2024/10/22 16:27

rt,第一个题解的做法

#include<bits/stdc++.h>
using namespace std;
#define pii pair<long long,long long>
#define fst first
#define scd second
#define ll long long
#define ls (p<<1)
#define rs (p<<1|1)	
#define maxn 500000
mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
const int N=1e6+5,M=1e7;
const ll mod=1e18+3;

ll rrand(ll L, ll R){
	return rd()%(R-L+1)+L;
}
int vis[M+5],cnt[N],a[N],tim[N];
ll val[N],hsh[N];
int apr[M];
pii lgl[N];
vector<int> prim;
int n,top;
void init(){
	memset(hsh,0,sizeof(hsh));
	memset(cnt,0,sizeof(cnt));
	memset(tim,0x3f,sizeof(tim));
	top=0;
}
inline void Ins(int pos,int x,int t){
	hsh[pos]^=val[x];
	cnt[pos]++,tim[pos]=min(tim[pos],t);
}
pii calc(int pos){
	int add=0;
	for(int i=1; i<=n; i++) {
		int x=abs(a[i]-a[pos]);
		if(!x){
			add++;
			continue;
		}
		for(int j=0; j<prim.size(); j++){
			int now=prim[j],t=0;
			if(x%now==0){
				while(x%now==0) x/=now,t++;
				Ins(j,i,t);
			}
			if(vis[x]>=0) {
				if(x!=1) Ins(vis[x],i,1);
				break;
			}
		}
	}
	int ans=0; ll ret=0,sum=1;
	for(int i=0; i<prim.size(); i++){
		ll ref=1;
		if(tim[i]<=100)
			for(int j=1; j<=tim[i]; j++)
				ref=ref*prim[i];
		if(cnt[i]>ans) ans=cnt[i],top=0;
		if(cnt[i]==ans) lgl[++top]=make_pair(hsh[i],ref);
	//	if(prim[i]<=100)cout<<prim[i]<<" "<<hsh[i]<<" "<<cnt[i]<<endl;
	}
	sort(lgl+1,lgl+top+1);
	for(int i=1; i<=top; i++){
		if(lgl[i].fst!=lgl[i-1].fst){
			ret=max(ret,sum);
			sum=lgl[i].scd;
		}
		else sum*=lgl[i].scd;
	}
	return make_pair(ans+add,sum);
}
int main(){
// 	freopen("seq3.in","r",stdin);
// 	freopen("my.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n;
	for(int i=2; i<=M; i++){
		if(vis[i]!=-1){
			vis[i]=prim.size();
			prim.push_back(i);
		}
		for(auto j : prim){
			if(1ll*i*j>M) break;
			vis[i*j]=-1;
			if(i%j==0) break; 
		}
	}
	pii res=make_pair(0,0);
	for(int i=1; i<=n; i++) cin>>a[i];
	for(int i=1; i<=n; i++){
		if(apr[a[i]]) val[i]=val[apr[a[i]]];
		else apr[a[i]]=i,val[i]=rrand(1,1e18);
	}
	for(int i=1; i<=40; i++){
		init();
		res=max(res,calc(rrand(1,n)));
	}
	cout<<res.fst<<" "<<res.scd<<"\n"; 
}
2024/10/22 16:27
加载中...