散列表
Ph[i]=(ph[i-1]*c+ch[i]-’a’)%p;
设ph[i]表示P[1..i]所对应的数, 则 P[i..j]=PH[j]-PH[i-1]*c^(j-i+1)
现在,我们求可以用O(n)的时间求出前缀和,然后用O(n)的时间预处c^i%p,理然后用O(1)的时间求出一个子串的hash(因为已经预处理了c^i%p所以不再需要快速幂。)
如果需要判断字符串s的子串s[i..j]与s[I’...j’]是否相同,我们用pow[i]表示c^i%p,f[i]表示前缀的hash值。
Hash1=(f[j]-f[i-1]*pow[j-i+1])%p;
If(hash1<0) hash1+=p;
Hash2=(f[j’]-f[I’-1]*pow[j’-I’+1])%p;
If (hash2<0) hash2+=p;
If (hash1==hash2) then 两字符串(可能)相等
关键字:sed = 31, SED = 131, mod = 70177, MOD = 92311
题目:对答案(字符hash+贪心)No.5