ShiftAnd算法

虽然可能不太实用,但是思想去很厉害。

先处理模式串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
原文地址:https://www.cnblogs.com/x1957/p/3103500.html