【bzoj2462】[BeiJing2011]矩阵模板

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

#define MAXN 100000000
#define prime1 9983543
#define prime2 9804799
#define MOD 99999971
#define N 1010

int m,n,A,B,q;

unsigned int hash;

unsigned int a[N][N],b[N][N],p1[N],p2[N];
bool h[MAXN];

int main()
{
    scanf("%d%d%d%d",&m,&n,&A,&B);
    for (int i=1;i<=m;i++)
        for (int j=1;j<=n;j++)
            scanf("%1d",&a[i][j]);
    for (int i=1;i<=m;i++)
        for (int j=1;j<=n;j++)
            a[i][j]+=a[i-1][j]*prime1;
    for (int i=1;i<=m;i++)
        for (int j=1;j<=n;j++)
            a[i][j]+=a[i][j-1]*prime2;
    p1[0]=1;
    p2[0]=1;
    for (int i=1;i<=min(m,n);i++)
        p1[i]=p1[i-1]*prime1,p2[i]=p2[i-1]*prime2;
    for (int i=A;i<=m;i++)
        for (int j=B;j<=n;j++)
        {
            hash=a[i][j];
            hash-=a[i-A][j]*p1[A];
            hash-=a[i][j-B]*p2[B];
            hash+=a[i-A][j-B]*p1[A]*p2[B];
            hash%=MOD;
            h[hash]=1;
        }
    scanf("%d",&q);
    while (q--)
    {
        for (int i=1;i<=A;i++)
            for (int j=1;j<=B;j++)
                scanf("%1d",&b[i][j]);
        for (int i=1;i<=A;i++)
            for (int j=1;j<=B;j++)
                b[i][j]+=b[i-1][j]*prime1;
        for (int i=1;i<=A;i++)
            for (int j=1;j<=B;j++)
                b[i][j]+=b[i][j-1]*prime2;
        puts(h[b[A][B]%MOD] ? "1" : "0");
    }
    return 0;
}
时间: 2024-08-02 11:05:00

【bzoj2462】[BeiJing2011]矩阵模板的相关文章

BZOJ-2462: [BeiJing2011]矩阵模板 (宇宙无敌超级大暴力~)

2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 1278  Solved: 607[Submit][Status][Discuss] Description 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.    所谓01矩阵,就是矩阵中所有元素不是0就是1. Input 输入文件的第一行为M.N.A.B,参见题目描述. 接下来M行,每行N个字符,非0即

BZOJ 2462: [BeiJing2011]矩阵模板

2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 915  Solved: 432[Submit][Status][Discuss] Description 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.    所谓01矩阵,就是矩阵中所有元素不是0就是1. Input 输入文件的第一行为M.N.A.B,参见题目描述. 接下来M行,每行N个字符,非0即1

【kmp算法】【Rabin-Karp算法】[BeiJing2011]矩阵模板

算法就不说了,反正是基于字符串匹配的.这里比较一下kmp和Rabin-Karp算法. <法一>kmp算法. 592788 lizitong 2462 Accepted 4828 kb 680 ms C++/Edit 2349 B 2014-03-29 19:07:02 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,a,b,q; char

POJ_Fibonacci POJ_3070(矩阵快速幂入门题,附上自己写的矩阵模板)

Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10521   Accepted: 7477 Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequenc

矩阵模板

1 const int mo=1000000007; 2 int n; 3 int ksm(int x,int y) 4 { 5 int z=1; 6 while(y) 7 { 8 if(y&1)z=(1ll*x*z)%mo; 9 y>>=1; x=(1ll*x*x)%mo; 10 } 11 return z; 12 } 13 int t[301][601]; 14 struct matrix 15 { 16 int a[301][601]; 17 void cheng(matrix

BZOJ 2462 BeiJing 2011 矩阵模板 二维hash

题目大意:给出一个m*n的由01组成的矩阵,下面有q个询问,查询矩阵中存不存在大小为k*l的子矩阵. 思路:二维hash.我们先把大矩阵hash,然后把所有可能的k*l的子矩阵都插到哈希表里,然后只要对于每个询问hash一下看哈希表中是否存在. 值得一提的是,这个题只需要输出10个1就可以AC了.. CODE: #include <cstdio> #include <bitset> #include <cstring> #include <iostream>

HDU 1757 矩阵相乘,快速幂模板题

HDU 1757 题意: If x < 10, f(x) = x; If x >= 10, f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + a9 * f(x-10);  给出k和mod,求f(k). 总结: 1.特别注意,矩阵相乘不满足交换律,即a*b != b*a.  2.感觉推方程有点困难. 3.矩阵初始化注意. f(x-10)   0 0 0 0 0 0 0 0 0        ( first矩阵 )       f(x-9)

HDU 2243 考研路茫茫――单词情结 ——(AC自动机+矩阵快速幂)

和前几天做的AC自动机类似. 思路简单但是代码200余行.. 假设solve_sub(i)表示长度为i的不含危险单词的总数. 最终答案为用总数(26^1+26^2+...+26^n)减去(solve_sub(1)+solve(2)+...+solve_sub(n)).前者构造f[i]=f[i-1]*26+26然后矩阵快速幂即可(当然也可以分治的方法).后者即构造出dp矩阵p,然后计算(p^1+p^2+...+p^n),对其分治即可. 代码如下: 1 #include <stdio.h> 2 #

latex 撰写科技报告模板

1.Latex简介 latex在撰写科技论文.科技报告方面有着强大的优势,在撰写复杂的数学公式和作图方面都很方便,适合有一定代码经验的人使用. 一个框架: \begin{document} \begin{CJK*}{UTF8}{gbsn} ........... \end{CJK*} \end{document} 1.1 部分宏命令 \textbf{}%文本黑体    mathbf{}%数学符号黑体    \limits_{i=1}^{n}%符号正上正下方   A_i^n%符号右下右上方 2.L