散列表

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

posted @ 2015-10-26 12:40  ACforever  阅读(124)  评论(0编辑  收藏  举报