字符串匹配之位并行算法Shift-Or
											
程序代码:// 位并行算法Shift-Or算法
// 1、对模式串构造掩码表设模式串为abacb
//   a b a c b的掩码表为
// a 1 0 1 0 0
// b 0 1 0 0 1
// c 0 0 0 1 0
// 2、置D = 0, 对于新输入文本字符szMsg[j],
// 用公式D >> 1 | 2^(len-1) & Bset[Index]-> D
// if szMsg[j] = a or A Then Index = 0 Bset[Index] = 20
// 3、如果D&1==1当前的模式串与文本的以j个为结尾
// 的最后len个字符匹配.str[0]...str[len-1] = szMsg[j-len+1]..szMsg[j]
#include <stdio.h>
#include <string.h>
#include <math.h>
const int MAX_LEN = 256;
// 创建位掩码集合
void CreateBset(char *str, int Bset[])
{
    int len = strlen(str);
    int i;
    int j;
    for (i=0; i<26; i++)// 行26 a到z
    {
       
        for (j=0; j<len; j++)
        {
            if (i == (str[j] - 'A')%32)//大小写一样匹配字母对应数字映射
            {
                Bset[i] += (int)pow((double)2, (double)(len-1-j)); //出现的就是1
            }
        }
       
    }
return;
}
int main()
{
    char str[256] = {0};
    char szMsg[1024] = {0};
    //输入模式串
    gets(str);
    //输入文本
    gets(szMsg);
    int len = strlen(str);
    int Bset[26] = {0};
    int D = 0;//位掩码
    int Index;
    //创建掩码表集合
    CreateBset(str, Bset);
    int j = 0;
    int count = 0;
    while(j<strlen(szMsg))
    {
        D = (D >> 1) | (int)pow((double)2, (double)(len - 1));//右移1或上最高位为1
        Index = szMsg[j] - 'A';
        D = D & Bset[Index%32];//读入的文本的掩码集&上D
        if (1 == (D&1))//如果D的二进制第一位为1目标匹配
        {
            count++;//匹配的个数
        }
        j++;
    }
    printf("匹配的个数%d\n", count);
    return 0;
}
	
		
			
		
	



											
	    

	