使用hash函数
预处理的时间复杂度是 O(m) //对比较字符串进行hash
查找时间复杂度是O(m*n)
Code:
#define REHASH(a,b,h) ((((h)-(a)*d)<<1)+(b))
int KR(char* x,int m,char* y,int n)
{
/* preprocessing */
for(d=i=1;i<m;++i)
{
d = (d<<1);
}
for(hy=hx=i=0;i<m;++i)
{
hx=((hx<<1)+x[i]);
hy=((hy<<1)+y[i]);
}
/* searching */
j = 0;
while(j<n-m)
{
if(hx==hy && memcmp(x,y+j,m) == 0)
{
return j;
}
hy = REHASH(y[j],y[j+m],hy);
}
}