zoukankan      html  css  js  c++  java
  • Hash

    为了解决map常数大的问题,有的时候要用到手写(Hash)

    把字符串看成是一个(base)进制的数,一般(base)取131就会比较稳妥
    那么对于一个字符串(S=c_1c_2c_3...c_n)的哈希值就是(c_1*base^n+c_2*base^{n-1}+c_3*base^{n-2}+...+c_n*base^1)
    直接用(unsigned long long)保存自然溢出也不会产生哈希冲突

    有的时候要截取一个字符串的一部分单独进行比较,这时候就可以用前缀和思想维护一个(Hash)数组
    (H[i])表示把字符串的前(i) 项看成一个(base)进制的数的值,那么转移的时候(H[i]=H[i-1]*base+s[i])
    所以这时候(l)(r)(Hash)值就是(H[r]-H[l-1]*base^{r-l+1}) 至于(base)的次方大小只要在求(H)的时候顺便求出即可

    void hash(int *a,char *c)
    {
    	int ss=strlen(c);
    	p[0]=1;
    	for(i=0;i<=c;i++)
    	{
    		a[i+1]=a[i]*base+c[i-'a'];
    		p[i+1]=p[i]*base;
    	}
    }
    
  • 相关阅读:
    2312--1.3.4 Prime Cryptarithm 牛式
    Slava and tanks 877C
    World Cup 996B(排队模拟)
    css内边距 边框
    iframs刷新的两种方法
    JS DOM节点
    JS对话框
    JS事件常用事件
    JS数组
    JS第一天
  • 原文地址:https://www.cnblogs.com/ZUTTER/p/9615310.html
Copyright © 2011-2022 走看看