【模板】字符串哈希
给定N个字符串,请求出N个字符串中共有多少个不同的字符串。
Hans:没有用什么高级东西处理冲突也没有写map水过去,而且是一个哈希哈哈哈哈。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p = 998244353;
int n;
ll tot, cnt;
char s[10010];
set<ll> S;
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
tot = 0;
scanf("%s", s);
for(int j = 0; j < strlen(s); j++){
int x = (int)s[j];
tot = tot * 10007ll + x;
}
if(!S.count(tot)){
cnt++;
S.insert(tot);
}
}
printf("%lld\n", cnt);
return 0;
}
题解区各种答案:
双哈希:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
ull base=131;
struct data
{
ull x,y;
}a[10010];
char s[10010];
int n,ans=1;
ull mod1=19260817;
ull mod2=19660813;
ull hash1(char s[])
{
int len=strlen(s);
ull ans=0;
for (int i=0;i<len;i++)
ans=(ans*base+(ull)s[i])%mod1;
return ans;
}
ull hash2(char s[])
{
int len=strlen(s);
ull ans=0;
for (int i=0;i<len;i++)
ans=(ans*base+(ull)s[i])%mod2;
return ans;
}
bool comp(data a,data b)
{
return a.x<b.x;
}
main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",s);
a[i].x=hash1(s);
a[i].y=hash2(s);
}
sort(a+1,a+n+1,comp);
for (int i=2;i<=n;i++)
if (a[i].x!=a[i-1].x || a[i-1].y!=a[i].y)
ans++;
printf("%d\n",ans);
}
set
#include<bits/stdc++.h>
using namespace std;
int n;
string t;
std::set<string> s;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>t;
s.insert(t);
}
cout<<s.size()<<endl;
return 0;
}
map
#include<bits/stdc++.h>//万能库
using namespace std;
map <string,bool> mp;//定义一个键值为string,映射值为bool的map
int ans,n;
string a;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>a;
if(!mp.count(a))//如果之前没有过这个映射
{
ans++;//答案加一
mp[a]=1;//记录
}
}
printf("%d\n",ans);
return 0;
}
pd_ds库 自带hash_table
#include<cstdio>
#include<iostream>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#define f(i,a,b) for(register int i=int(a);i<=int(b);++i)
using namespace std;
__gnu_pbds::cc_hash_table<string,int>ht;//或者gp_hash_table,貌似慢一点
int main()
{
int n,sum=0;
string s,instead;
scanf("%d",&n);getline(cin,instead);
f(i,1,n)
{
getline(cin,s);
if(!ht[s])ht[s]=1,++sum;
}
printf("%d\n",sum);
}
BKDR Hash
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
ULL h[100000];
ULL seed=163;
inline ULL hash(string x){
ULL Hash=0;
int len=x.length()-1;
for(int i=0;i<=len;++i){
Hash=Hash*seed+x[i]-'0';
}
return Hash;
}
int main(){
int n;
cin>>n;
string que;
for(int i=1;i<=n;++i){
cin>>que;
h[i]=hash(que);
}
sort(h+1,h+n+1);
int ans=0;
for(int i=1;i<=n;++i){
if(h[i]!=h[i+1]) ans++;
}
cout<<ans;
return 0;
}
差不多了吧。附上路过随机抽取的博客链接
Here