虽然可能不太实用,但是思想去很厉害。
先处理模式串P,得到一个表B,记录字母表中每个字母位的掩码bm....b1,如果P_j=c 那么掩码B[c]的第j位位置为1,否则为0。
匹配过程就是对D的更新
D = ((D << 1) | 1) & B[T[i]]
#include <string.h> #include <stdio.h> const int maxn = 1000; int shift_and(char* T , char* P) { unsigned int B[256] = {0}; unsigned int D = 0; for(int i = 0 ; P[i] ; i++) B[P[i]] |= 1 << i; int len_p = strlen(P); for(int i = 0 ; T[i] ; i++) { D = ((D << 1) | 1) & B[T[i]]; if(D & (1<< (len_p-1))) return i - len_p + 1; } return -1; } int main() { char T[maxn]; char P[32]; scanf("%s %s",T,P); printf("%d\n",shift_and(T,P)); }