可能是loser的模板太吓人了,我一直都没看过hash,直到一份正常的模板出现
先来一个模板
双模数hash
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 10005
#define ull unsigned long long
using namespace std;
struct hh{ull x,y;}ans[N];
char st[1550];
const ull base=131;
const ull Mod1=19260817;
const ull Mod2=19660813;
ull hash1(char st[])
{
int l=strlen(st);
ull ans=0;
for (int i=0;i<l;i++)
ans=(ans*base+(ull)st[i])%Mod1;
return ans;
}
ull hash2(char st[])
{
int l=strlen(st);
ull ans=0;
for (int i=0;i<l;i++)
ans=(ans*base+(ull)st[i])%Mod2;
return ans;
}
int cmp(hh a,hh b){if (a.x==b.x) return a.y<b.y;else return a.x<b.x;}
int main()
{
int n,i;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%s",&st);
ans[i].x=hash1(st);
ans[i].y=hash2(st);
}
sort(ans+1,ans+n+1,cmp);
int ll=1;
for (i=2;i<=n;i++)
if (ans[i-1].x!=ans[i].x || ans[i-1].y!=ans[i].y)
ll++;
printf("%d",ll);
}
如果你很强,在考场上背过一个10^18的质数,也可以%一下
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 10005
#define ull unsigned long long
using namespace std;
char st[1550];
ull ans[N];
const ull base=131;
const ull Mod=212370440130137957ull;
ull hashs(char st[])
{
int l=strlen(st);
ull ans=0;
for (int i=0;i<l;i++)
ans=(ans*base+(ull)st[i])%Mod;
return ans;
}
int main()
{
int n,i;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%s",&st);
ans[i]=hashs(st);
}
sort(ans+1,ans+n+1);
int ll=1;
for (i=2;i<=n;i++)
if (ans[i-1]!=ans[i])
ll++;
printf("%d",ll);
}
自然溢出hash
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 10005
#define ull unsigned long long
using namespace std;
char st[1550];
ull ans[N];
const ull base=131;
ull hashs(char st[])
{
int l=strlen(st);
ull ans=0;
for (int i=0;i<l;i++)
ans=ans*base+(ull)st[i];
return ans&0x7fffffff;
}
int main()
{
int n,i;
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%s",&st);
ans[i]=hashs(st);
}
sort(ans+1,ans+n+1);
int ll=1;
for (i=2;i<=n;i++)
if (ans[i-1]!=ans[i])
ll++;
printf("%d",ll);
}
to be continued...