其他分享
首页 > 其他分享> > 字符串哈希

字符串哈希

作者:互联网

【模板】字符串哈希 - 洛谷

1.哈希法:将字符串转化成某个进制的整数(大进制)否则容易造成哈希冲突,即不同的字符串转化的数却相同,再进行数字间不同的比较

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const ull mod=327819827801;
ull a[100010];
ull hashe(string s){
	ull res=0;
	for(int i=0;i<s.size();i++){
		res=(res*131+ull(s[i]))%mod;//将字符串转化为进制为131的整数 
	}
	return res;
}
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		string s;
		cin>>s;
		a[i]=hashe(s);//a[i]中存放每个字符串对应的数 
	}
	sort(a,a+n);
	ull ans=1;
	for(int i=0;i<n-1;i++){
		if(a[i]!=a[i+1])ans++;
	}
	cout<<ans;
	return 0;
}

2.c++中的stl库中的集合set(具有去重的功能)

#include <bits/stdc++.h>
using namespace std;
set<string>s;//集合set自带去重功能 
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		string s1;
		cin>>s1;
		s.insert(s1);
	}
	cout<<s.size();
	return 0;
}

3.直接利用sort将字符串按字典序排序

#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
string s[N];
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>s[i];
	}
	sort(s,s+n);
	int ans=1;
	for(int i=0;i<n-1;i++){
		if(s[i]!=s[i+1])ans++;
	}
	cout<<ans<<endl;
	return 0;
} 

标签:哈希,int,namespace,ull,字符串,include
来源: https://blog.csdn.net/m0_61094896/article/details/123191808