1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Shift-And算法

Posted on 2013-05-28 13:59  1957  阅读(301)  评论(0编辑  收藏  举报

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

先处理模式串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));
}