zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    扯一扯纯函数
    10.28
    10.27 动手动脑5
    10.26
    10.25 周总结
    10.23
    10.22
    10.21 动手动脑4
    10.20
    10.19
  • 原文地址:https://www.cnblogs.com/x1957/p/3103500.html
Copyright © 2011-2022 走看看