我对于字符串哈希的理解。。。可能就是一个神奇的函数把一个字符串转化成一个数吧(
hy:比如说现在有一个字符串orzc 枚举这个字符串的每一位,与base相乘得到ans,然后mod一下,就得到orzc的哈希值
这只是字符串哈希的一种写法……(这种写法正确性客观来说是非常高的)
也就是说哈希函数是可以自己定义的。
这里用到的是自然溢出。计算机内部是怎么处理自然溢出的大概不在我们的学习范围内……??
自然溢出大概是指-->(unsigned long long)在超出存储的最大上限之后会以某种玄学的方式自动(mod)掉某数……
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define MAXN 10005
#define base 107
#define scanf(a) scanf("%lld",&a)
#define print(a) printf("%lld",a)
#define printn(a) printf("%d
",&a);
using namespace std;
long long n,m;
int f[MAXN];
unsigned long long hash(string s)
{
unsigned long long ans=0,len=s.size();
for (long long i=0;i<len;i++)
{
ans=base*ans+(unsigned long long)s[i];
}
return ans;
}
void init()
{
scanf(n);
string s;
for (long long i=1;i<=n;i++)
{
cin>>s;
f[i]=hash(s);
}
sort(f+1,f+n+1);
}
void start()
{
long long ans=0;
for (int i=1;i<=n;i++)
{
if (f[i]!=f[i-1])
{
ans++;
}
}
print(ans);
}
int main()
{
init();
start();
return 0;
}