今天补了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;
}