一、进制哈希
1、思路
给出一个固定进制base,将一个串的每一个元素看做一个进制位上的数字,所以这个串就可以看做一个base进制的数,而这个数就是这个串的哈希值;则我们通过比对每个串的的哈希值,即可判断两个串是否相同
2、代码(洛谷3370)
特别要注意:s[i]-'a'+1,其中加1绝对不能省略,否则ba和b的哈希值会是一样的
#include<bits/stdc++.h>
using namespace std;
const int MAX = 1510;//字符串最长长度
const int p = 1e9+7;//取模
long long base[MAX];//预处理出base进制的每一位
int n;
char s[MAX];
map<long long, int> h;//将哈希值来计数
int main()
{
int ans=0;
base[0] = 1;
for(int i=1; i<=1505; ++i)
base[i] = base[i-1]*26%p;
cin>>n;
while(n--)
{
cin>>s;
int len = strlen(s);
long long ret = 0;
for(int i=0; i<len; ++i)
ret = (ret+(s[i]-'0'+1)*base[i])%p;//将字符串转为base进制的数
if(!h[ret]) ans++;
h[ret]=1;
}
cout<<ans;
return 0;
}