博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2351 Matrix(哈希)
阅读量:6894 次
发布时间:2019-06-27

本文共 1031 字,大约阅读时间需要 3 分钟。

题目链接:

题意:给出一个n*m的01矩阵。再给出10个A*B的小01矩阵。判断这些小的矩阵是不是原矩阵的子矩阵。

思路:将原矩阵的每个A*B的矩阵哈希成一个值。给出的小矩阵也哈希成一个值。则直接查找即可。

 

char s[N][N];
int n,m,A,B;
u64 h[N][N],f[N][N];
u64 p[N];
void init()
{
    if(B>m) return;
    int i,j;
    u64 x;
    FOR1(i,n)
    {
        x=0;
        FOR1(j,B) x=x*107+s[i][j];
        f[i][B]=x;
        for(j=B+1;j<=m;j++) 
        {
            f[i][j]=(f[i][j-1]-s[i][j-B]*p[B-1])*107+s[i][j];
        }
    }
    if(n<A) return;
    for(j=B;j<=m;j++)
    {
        x=0;
        FOR1(i,A) x=x*107+f[i][j];
        h[A][j]=x;
        for(i=A+1;i<=n;i++) 
        {
            h[i][j]=(h[i-1][j]-f[i-A][j]*p[A-1])*107+f[i][j];
        }
    }
}
char str[N][N];
int OK(int x,int y)
{
    int i,j;
    FOR1(i,A) FOR1(j,B) if(str[i][j]!=s[x-A+i][y-B+j])
    {
        return 0;
    }
    return 1;
}
int check()
{
    if(B>m||A>n) return 0;
    int i,j;
    u64 a[105];
    FOR1(i,A)
    {
        a[i]=0;
        FOR1(j,B) a[i]=a[i]*107+str[i][j];
    }
    i64 x=0;
    FOR1(i,A) x=x*107+a[i];
    for(i=A;i<=n;i++) for(j=B;j<=m;j++) 
    {
        if(h[i][j]==x&&OK(i,j)) return 1;
    }
    return 0;
}
int main()
{
    RD(n,m); RD(A,B);
    int i;
    FOR1(i,n) RD(s[i]+1);
    p[0]=1;
    for(i=1;i<N;i++) p[i]=p[i-1]*107;
    init();
    int k;
    RD(k);
    while(k--)
    {
        FOR1(i,A) RD(str[i]+1);
        PR(check());
    }
}

转载地址:http://gmzdl.baihongyu.com/

你可能感兴趣的文章
JS中typeof与instanceof的区别
查看>>
PHP中str_replace函数使用小结
查看>>
Oracle用户、角色、授权和表空间
查看>>
linux下修改SWAP空间大小
查看>>
我的友情链接
查看>>
mac 安装python3.4、django
查看>>
你想建设一个能承受500万PV/每天的网站吗?如果计算呢?
查看>>
iOS8完美越狱在路上了吗?
查看>>
编写更好的jQuery代码的建议
查看>>
linux 入门基础知识(一)
查看>>
项目质量管理
查看>>
将linux英文系统变成中文系统
查看>>
CXDVA视频组件
查看>>
给自己降降级你会发现一片广阔的天空
查看>>
Linux Apache 编译安装;
查看>>
python2.7x Django mysql在windows Ubuntu下的环境搭建
查看>>
33 一生能有几个?
查看>>
我的友情链接
查看>>
一键安装lnmp报错 pycurl.so: undefined symbol: CRYPTO_set_locking_callback
查看>>
Ext4 把分页的Demo整合到MVC模式中
查看>>