Shift-And & Shift-Or

Shift And

一种暴力字符串匹配算法,用bitset优化。复杂度\(O(N*M/w)\)

\(p\)记录当前匹配第几位是成立的,\(skip\)记录字符是\(c\)的有哪些位置。匹配时,\(p\)中第\(k\)位置是成立的,且下一位正好是\(skip\)对应的字符。那么下一位成立。

bitset<MAXN>skip[26], p;
for (int i = 1; i <= m; ++i)
    skip[B[i] - 'a'][i] = 1;
for (int i = 1; i <= n; ++i) {
    p <<= 1; 
    p[1] = 1; 
    p &= skip[A[i] - 'a'];
    if (p.test(m)) 
        printf("%d\n", i - m + 1);
}

Shift-Or 与Shift-And 的唯一区别在于,在Shift-Or 中,“有效位” 是通过0(而不是1)来标识。

例题:
HDU: 5972 Regular Number

posted on 2024-07-22 20:48  Quixotica  阅读(78)  评论(0)    收藏  举报