BZOJ2351: [BeiJing2011]Matrix
2351: [BeiJing2011]Matrix
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 589 Solved: 171
[Submit][Status]
Description
给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过。
所谓01矩阵,就是矩阵中所有元素不是0就是1。
Input
输入文件的第一行为M、N、A、B,参见题目描述。
接下来M行,每行N个字符,非0即1,描述原矩阵。
接下来一行为你要处理的询问数Q。
接下来Q个矩阵,一共Q*A行,每行B个字符,描述Q个01矩阵。
Output
你需要输出Q行,每行为0或者1,表示这个矩阵是否出现过,0表示没有出现过,1表示出现过。
Sample Input
111
000
111
3
11
00
11
11
00
11
Sample Output
0
1
HINT
对于100%的实际测试数据,M、N ≤ 1000,Q = 10
对于40%的数据,A = 1。
对于80%的数据,A ≤ 10。
对于100%的数据,A ≤ 100。
题解:
因为大小固定的矩阵最多只有100W个,那么我们可以把所有的矩阵hash出来,然后直接查询即可。
代码的实现参考了PoPoQQQ,很有技巧性。
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 1500
#define maxm 1000000+5
#define eps 1e-10
#define ull unsigned long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define mod 999983
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,tot,head[maxm],a,b;
ull sum[maxn][maxn],power[][maxn];
struct edge{ull go;int next;}e[maxm];
const ull base[]={,};
inline void hash(ull x)
{
int y=x%mod;
e[++tot]=(edge){x,head[y]};head[y]=tot;
}
inline bool ask(ull x)
{
for(int i=head[x%mod];i;i=e[i].next)if(e[i].go==x)return ;
return ;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();m=read();a=read();b=read();
for1(i,n)for1(j,m){char ch=getchar();while(ch!=''&&ch!='')ch=getchar();sum[i][j]=ch-'';}
for1(i,n)for1(j,m)sum[i][j]+=sum[i-][j]*base[];
for1(i,n)for1(j,m)sum[i][j]+=sum[i][j-]*base[];
power[][]=power[][]=;
for1(i,maxn-)for0(j,)power[j][i]=power[j][i-]*base[j];
for2(i,a,n)
for2(j,b,m)
hash(sum[i][j]-sum[i-a][j]*power[][a]-sum[i][j-b]*power[][b]+sum[i-a][j-b]*power[][a]*power[][b]);
int q=read();
while(q--)
{
for1(i,a)for1(j,b){char ch=getchar();while(ch!=''&&ch!='')ch=getchar();sum[i][j]=ch-'';}
for1(i,a)for1(j,b)sum[i][j]+=sum[i-][j]*base[];
for1(i,a)for1(j,n)sum[i][j]+=sum[i][j-]*base[];
if(ask(sum[a][b]))printf("1\n");else printf("0\n");
}
return ;
}
BZOJ2351: [BeiJing2011]Matrix的更多相关文章
- BZOJ2351[BeiJing2011]Matrix——二维hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
- 【矩阵哈希】【哈希表】bzoj2351 [BeiJing2011]Matrix
引用题解:http://blog.csdn.net/popoqqq/article/details/41084047 #include<cstdio> #include<cstrin ...
- 2351: [BeiJing2011]Matrix( hash )
hash一下, 把原矩阵所有A*B的子矩阵的hash值存在set里面, 然后对于每个询问就求出hash值, 在set中查找. ------------------------------------- ...
- 【bzoj2351】[BeiJing2011]Matrix 二维Hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
- bzoj 2351 [BeiJing2011]Matrix——二维哈希
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2351 就是先把每行单独从左到右扫着乘一个 b1 哈希起来,然后再按列从上往下乘一个 b2 哈 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ2553: [BeiJing2011]禁忌
2553: [BeiJing2011]禁忌 Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 203 Solved: ...
- 【BZOJ2553】[BeiJing2011]禁忌 AC自动机+期望DP+矩阵乘法
[BZOJ2553][BeiJing2011]禁忌 Description Magic Land上的人们总是提起那个传说:他们的祖先John在那个东方岛屿帮助Koishi与其姐姐Satori最终战平. ...
- angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation
今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:
随机推荐
- 暑假集训(2)第七弹 -----今年暑假不AC(hdu2037)
J - 今年暑假不AC Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64 ...
- CruiseControl.NET : svnrevisionlabeller
How to use svnrevisionlabeller as your labeller type in CC.NET: 1. Download ccnet.SvnRevisionLabelle ...
- makefile--#的不正确使用
/usr/vacpp/bin/makeC++SharedLib -o /cicm/src/dao/testcase/rel/FUNCTEST.ibmcpp -brtl -bnortllib -p100 ...
- 九度OJ 1511 从尾到头打印链表
题目地址:http://ac.jobdu.com/problem.php?pid=1511 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测 ...
- Make和Makefile
无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型 ...
- 怎么用程序获取远程url执行后的图片地址
远程URL:https://121.199.16.229:8890/generate.cgi?rbid=1001&esn=22021434025005&pic=png&coun ...
- linux (centos 6.4)安装自定义分区方案(转载)
在计算机上安装 Linux 系统,对硬盘进行分区是一个非常重要的步骤,下面介绍几个分区方案. 方案 1 / :建议大小在 5GB 以上. swap :即交换分区,建议大小是物理内存的 1~2 倍. 方 ...
- ACE 6.2.0 win7_64 编译
Windows平台 ~ Microsoft Visual Studio 1) 下载ACE源码 ACE官方网址:http://www.cs.wustl.edu/~schmidt/ACE.h ...
- start-stop-daemon 命令
Usage: start-stop-daemon [<option> ...] <command> Commands: -S|–start — <argument> ...
- PHP联合sqlserver2008使用的全过程 ( 原创 亲测)
一.环境 php5.2.5 sqlserver2008 win7 二.配置PHP 1.打开php.in将extension=php_mssql.dll的注释符号去掉. 2.打开php.in将mssql ...