今天补了2016大连赛区的一个题目,关于shift and算法的问题,所以去学了shift and算法,具体的原理不是非常清楚,先记录个模板在这里,应该有用,复杂度是O(n)。
//shift and
int shift_and(char *s1, int len1, char *s2, int len2){ //s1是文本,s2是模式串,功能是返回模式串在文本串中出现的第一个位置
int B[128];
memset(B, 0, sizeof(B));
for(int i = 0; i < len2; i++) B[s2[i]] |= 1<<i;
int D = 0;
for(int i = 0; i < len1; i++){
D = ((D<<1)|1) & B[s1[i]];
if(D & (1<<(len2-1)))
return i-len2+1;
}
return -1;
}