UVA 11019 字符矩阵哈希

来源:互联网 发布:侠客风云传 招式数据 编辑:程序博客网 时间:2024/06/06 11:41

思路:以前没做过字符矩阵的哈希,所以这题是看别人博客写的。

#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<queue>#include<set>#include<cmath>#include<bitset>#define mem(a,b) memset(a,b,sizeof(a))#define lson i<<1,l,mid#define rson i<<1|1,mid+1,r#define llson j<<1,l,mid#define rrson j<<1|1,mid+1,r#define INF 0x7fffffff#define seed 13131#define seed1 1313#define maxn 1005typedef long long ll;typedef unsigned long long ull;using namespace std;ull p,Hash[maxn][maxn],Hash1[maxn][maxn];char s[maxn][maxn],str[105][105];int n,m,x,y;ull getHash(){    ull a,b=0;    for(int i=0;i<x;i++)    {        a=0;        for(int j=0;j<y;j++)            a=a*seed1+str[i][j];        b=b*seed+a;    }    return b;}int getAns(){    ull base,a;    int ans=0;    base=1;    for(int i=0;i<y;i++)        base*=seed1;    for(int i=0;i<n;i++)    {        a=0;        for(int j=0;j<y;j++)            a=a*seed1+s[i][j];        Hash1[i][y-1]=a;        for(int j=y;j<m;j++)            Hash1[i][j]=Hash1[i][j-1]*seed1-s[i][j-y]*base+s[i][j];    }    base=1;    for(int i=0;i<x;i++)        base*=seed;    for(int i=y-1;i<m;i++)    {        a=0;        for(int j=0;j<x;j++)            a=a*seed+Hash1[j][i];        Hash[x-1][i]=a;        if(a==p) ans++;        for(int j=x;j<n;j++)        {            Hash[j][i]=Hash[j-1][i]*seed-Hash1[j-x][i]*base+Hash1[j][i];            if(Hash[j][i]==p) ans++;        }    }    return ans;}int main(){    //freopen("1.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)            scanf("%s",s[i]);        scanf("%d%d",&x,&y);        for(int i=0;i<x;i++)            scanf("%s",str[i]);        p=getHash();        printf("%d\n",getAns());    }    return 0;}


0 0