Oulipo 哈希

求模式串在待匹配串的出现次数。

Input

第一行是一个数字T,表明测试数据组数。
之后每组数据都有两行:第一行为模式串,长度不大于10000;第二行为待匹配串,长度不大于1000000。所有字符串只由大写字母组成。

Output

每组数据输出一行结果。

Sample Input

4
ABCD
ABCD
ABA
ABABABA
CDCDCDC
CDC
KMP
NAIVE

Sample Output

1
3
0
0
#include <stdio.h>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
#define ULL unsigned long long
char a[1000006];
ULL p=223;
ULL c[1000006],b[1000006];
char d[1000006];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        a[0]=1;
        scanf("%s",a+1);
        int len=strlen(a);
        ULL e=0;
        for(int i=1;i<len;i++)
        {
            e=e*p+a[i];
        }
        d[0]=1;
        scanf("%s",d+1);

        int len1=strlen(d);
        b[0]=1;
        for(int i=1;i<len1;i++)
        {
            b[i]=b[i-1]*p;
        }
        c[0]=0;
        for(int i=1;i<len1;i++)
        {
            c[i]=c[i-1]*p+d[i];
        }
        int sum=0;ULL ee;
        for(int i=len-1;i<len1;i++)
        {
            ee=c[i]-c[i-len+1]*b[i-(i-len+1)];

            if(ee==e)
                sum++;
        }
        printf("%d\n",sum);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/liuliu2333/article/details/81782964