uva 11019 Matrix Matcher 字符串哈希

来源:互联网 发布:日本武士刀淘宝 编辑:程序博客网 时间:2024/05/04 20:08

题意:一个文本矩阵和一个模式矩阵,求模式矩阵在文本矩阵中出现次数。

二维哈希。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define a 321#define b 207#define ull long longint n,m,x,y;ull h1[1100][1100],h2[1100][1100];char T[1100][1100],P[110][110];void init(){    memset(h1,0,sizeof(h1));    memset(h2,0,sizeof(h2));}int main(){    int cas;    scanf("%d",&cas);    while(cas--)    {        init();        int sum=0;        ull ta=1,tb=1;;        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++) scanf("%s",T[i]);        scanf("%d%d",&x,&y);        for(int i=0;i<x;i++) scanf("%s",P[i]);        for(int i=1;i<=y;i++) ta*=a;        for(int i=1;i<=x;i++) tb*=b;        ull ans=0;        for(int i=0;i<x;i++)            for(int j=0;j<y;j++)                h1[i][0]=h1[i][0]*a+P[i][j];        for(int i=0;i<x;i++)            ans=ans*b+h1[i][0];        init();        for(int i=0;i<n;i++)        {            for(int j=0;j<y;j++)                h1[i][0]=h1[i][0]*a+T[i][j];            for(int j=1;j+y<=m;j++)                h1[i][j]=h1[i][j-1]*a+T[i][j+y-1]-T[i][j-1]*ta;        }        for(int j=0;j<m;j++)        {            for(int i=0;i<x;i++)                h2[0][j]=h2[0][j]*b+h1[i][j];            for(int i=1;i+x<=n;i++)                h2[i][j]=h2[i-1][j]*b+h1[i+x-1][j]-h1[i-1][j]*tb;        }        for(int i=0;i+x<=n;i++)            for(int j=0;j+y<=m;j++)                if(h2[i][j]==ans) sum++;        printf("%d\n",sum);    }    return 0;}


0 0
原创粉丝点击