Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

贴一个125ms 的哈希

Posted by WeiGuan at 2017-08-17 10:27:40 on Problem 3261
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const int maxn=20004;
const ll mul=131, p1=1000000007, p2=1000000009;
ll hash1[maxn], hash2[maxn], pow1[maxn], pow2[maxn];
int N, K, temp, x, L, R, flag;
namespace myMap{
	int tot, plot[maxn], nxt[maxn], head[maxn], cnt[maxn];
	ll val[maxn], val2[maxn];
	void init(){
		tot=1;
		memset(nxt, 0, sizeof(nxt));
		memset(head, 0, sizeof(head));
		memset(cnt, 0, sizeof(cnt));
	}
	bool insert(int hash1, int hash2, int pos){
		int v=hash1%(maxn-1);
		for(int t=head[v]; t; t=nxt[t])if(val[t]==hash1 && val2[t]==hash2)
			return ++cnt[t]>=K;
		nxt[tot]=head[v],
		val[tot]=hash1,
		val2[tot]=hash2,
		plot[tot]=pos,
		cnt[tot]=1,
		head[v]=tot++;
		return false;
	}
}
int main(){
	scanf("%d%d",&N,&K);
	pow1[0]=pow2[0]=1;
	for(int i=1; i<maxn; i++)
		pow1[i]=pow1[i-1]*mul%p1,
		pow2[i]=pow2[i-1]*mul%p2;
	for(int i=1; i<=N; i++)
		scanf("%d",&temp),
		hash1[i]=(hash1[i-1]*mul+temp)%p1,
		hash2[i]=(hash2[i-1]*mul+temp)%p2;
	for(L=0, R=N-K+2; L+1<R; flag?L=x:R=x){
		myMap::init();
		x=(L+R)>>1;
		flag=false;
		for(int i=x; i<=N; i++){
			ll t1=(hash1[i]+p1-(pow1[x]*hash1[i-x])%p1)%p1;
			ll t2=(hash2[i]+p2-(pow2[x]*hash2[i-x])%p2)%p2;
			if(myMap::insert(t1, t2, i)){
				flag=true; break;
			}
		}
	}
	printf("%d\n", L);
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator