分析:
- 进制哈希
- 将一个串的每一个元素看做一个进制位上的数字,因为ASCII码值是0到127,所以我们设置固定的进制就需要大于127(拿130为例);但我们不能将为每个字符串开辟一个数组来表示这个字符串是否存在(空间会爆),这时我们就需要用到取模(mod=1000为例),但是不同的数取模后结果可能会相同,这时我们就需要用到vector <string> a[1000]
- a[h][i]中h取模的结果,i表示a[h]中的第i个字符串
代码:
#include <bits/stdc++.h>
using namespace std;
int ans,n,mod=1000;
vector <string> a[1000];
void hs(string s)
{
int h=0;
for(int i=0;i<s.size();i++)
h=(h*130+s[i])%mod; //进行取模
for(int i=0;i<a[h].size();i++)
{
if(a[h][i]==s) //查询s字符串是否存在过
return; //存在,直接结束
}
a[h].push_back(s);
ans++; //不存在,将s存入a[h]中,并使ans加一
}
int main()
{
cin>>n;
string s;
for(int i=0;i<n;i++)
{
cin>>s;
hs(s);
}
cout<<ans;
return 0;
}