地址:https://www.luogu.org/problem/P3370
求不同字符串的数量
这题用set也可以过,但是hash更高大上嘛。
哈希其实就是将一个字符串映射成一个值,并且要让这些值不能大概率地重复
进制哈希:进制哈希的核心便是给出一个固定进制
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e4+19;
const ll base=129;
const long long mod=212370440130137957ll; //我也不知道为啥用这个,记住就行了
ll has[maxn];
char s[maxn];
int ac(char *s)
{
int len=strlen(s);
ll sum=0;
for(int i=0;i<len;i++)
{
sum=(sum*base+(ll)s[i])%mod;
}
return sum;
}
int main()
{
ll t;
scanf("%lld",&t);
for(int i=0;i<t;i++)
{
scanf("%s",s);
has[i]=ac(s);
}
sort(has,has+t);
ll cnt=1;
for(int i=0;i<t-1;i++)
{
if(has[i]!=has[i+1])
cnt++;
}
printf("%lld\n",cnt);
return 0;
}