挺喜欢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加强版