字符串hash(4hash)模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
typedef unsigned long long ull;
using namespace std;
const long long h1=998244353,h2=1000000007,h3=2147483647,h4=999971;
struct T{
	unsigned long long hh1,hh2,hh3,hh4;
}t[10000+10];
char s[3000];
ull hash1(char *s,int len){
	ull ans=0;
	for(int i=0;i<len;i++){
		ans=ans*h1+s[i];
	}
	return ans;
}
ull hash2(char *s,int len){
	ull ans=0;
	for(int i=0;i<len;i++){
		ans=ans*h2+s[i];
	}
	return ans;
}
ull hash3(char *s,int len){
	ull ans=0;
	for(int i=0;i<len;i++){
		ans=ans*h3+s[i];
	}
	return ans;
}
ull hash4(char *s,int len){
	ull ans=0;
	for(int i=0;i<len;i++){
		ans=ans*h4+s[i];
	}
	return ans;
}
bool cmp(T u,T v){
	return u.hh1<v.hh1;
}
int main(){
	int i,j,k,m,n;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%s",s);
		int len=strlen(s);
		t[i].hh1=hash1(s,len),t[i].hh2=hash2(s,len),t[i].hh3=hash3(s,len),t[i].hh4=hash4(s,len);
	}
	int ans=0;
	sort(t+1,t+1+n,cmp);
	for(i=1;i<=n;i++){
		while(t[i].hh1==t[i+1].hh1){
			if(t[i].hh2==t[i+1].hh2){
				if(t[i].hh3==t[i+1].hh3){
					if(t[i].hh4==t[i+1].hh4){
						i++;
					}
				}
			}
		}
		ans++;
	}
	printf("%d",ans);
	return 0;
}


posted @ 2016-11-18 13:42  Drinkwater_cnyali  阅读(209)  评论(0)    收藏  举报