直到今天,我才知道哈希是这样写的。
对于一个字符串c,我们可以将它hash掉,得到一个与众不同的值。
定义
typedef unsigned long long ull; const int N=4e5+10; char c[N]; ull h[N],g[N]; void hash(){ g[0]=1; for(int i=1;c[i];i++){ h[i]=h[i-1]*131+c[i]; g[i]=g[i-1]*131; } }
则它的子串为,其中p为一个质数。
ull tt=h[len]-h[len-i]*g[i];
利用ull的性质,大于上限的数会被自动取模,达到hash的目的。