poj 3461 hash解法

字符串hash

https://blog.csdn.net/pengwill97/article/details/80879387

https://blog.csdn.net/chaiwenjun000/article/details/71079819

AC代码

#include <cmath>
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
using namespace std;
typedef unsigned long long ull;
const int maxn=1e6+10;
const int base=13331; //base,基数

ull power[maxn]; //存储b^n
void init()
{
    power[0]=1; //base^0=1
    for(int i=1; i<maxn; i++)
        power[i]=power[i-1]*base; //对ull取模
}

char s1[maxn],s2[maxn];
ull Hash[maxn]; //记录主串哈希值的数组

int main()
{
    init();
    int T;
    cin>>T;
    while(T--)
    {
        scanf("%s%s",s1+1,s2+1); //从第一位开始输入
        int n=strlen(s1+1),m=strlen(s2+1);
        Hash[0]=0; //记录主串哈希值的数组
        for(int i=1; i<=m; i++) //计算主串的滚动Hash值
            Hash[i]=Hash[i-1]*base+(ull)(s2[i]-'A'+1);
        ull s=0;
        for(int i=1; i<=n; i++) //计算匹配串的Hash值
            s=s*base+(ull)(s1[i]-'A'+1);
        int ans=0;
        for(int i=0; i<=m-n; i++)
            if(s==Hash[i+n]-Hash[i]*power[n])
                ans++;
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2019-02-23 20:45  灬从此以后灬  阅读(266)  评论(0编辑  收藏  举报