挺喜欢hash的,可能是因为hash的运用比较灵活吧。现在对就对ac的几个题做个分类。
大整数的hash,含多个整数(这类题的hash函数比较灵活)
poj2875 poj1840 poj3640 poj3349
poj2002 key=(abs(p[i].x)*99983+abs(p[i].y)*13)%77777;
poj1200 (将字符串看成26进制数)
字符串的hash(有许多现成函数,选择合适的就行)
poj 2503
int ELFhash(char *key)
{
unsigned long h=0;
while(*key)
{
h=(h<<4)+*key++;
unsigned long g=h&0Xf0000000L;
if(g) h^=g>>24;
h&=~g;
}
return h%MOD;
}
数组的hash(有现成函数)
poj3274
int getkey(int *v,int k)
{
int i,p=0;
for(i=1; i<k; i++)
p=((p<<2)+(v[i]>>4))^(v[i]<<10);
p = p%prime;
if(p<0) p=p+prime;
return p;
}
全排列的hash (没有冲突的hash,利用全排列与逆序数列一一对应的原理)
poj1077
int getkey(int *seq)
{
int i,j,cnt,key=0;
for(i=0;i<9;i++)
{
cnt=0;
for(j=0;j<i;j++)
if(seq[j]>seq[i])
cnt++;
key+=cnt*fac[i]; // cnt<=i
}
return key;
}
HDU
hash一般用在搜索中用于判重
单纯考察hash的题目不多,
有些需要处理冲突
1904 最普通的
1800 需要处理冲突
1755 典型hash
1482 中途用到hash思想
1496 经典hash
2141 经典hash加强版