虽然可能不太实用,但是思想去很厉害。
先处理模式串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));
}
by 1957
浙公网安备 33010602011771号