我没写hash,写了一些奇怪的做法,好像被hash随便操了……

如果没有多测,那么这道题是白书上的例题

把询问矩阵当作a个模板串,建成一个ac自动机

把一开始的矩阵当作n个串放到自动机上匹配,找到a个模板串所有出现的位置

然后找到对应矩阵的左上角上计数(即如果是第i个模板串出现在第x个串的第y个位置,则g[x-i+1,y-b+1]++)

然后判断是否有能接收a个模板串的左上角即可

加了一些剪枝过了2462……

然后2351无限TLE……

要来数据发现,当a=4 b=5的那个点跑了好长时间

有什么做法可以在a非常小的时候快速出解呢?(我就是不想写hash……)

由于询问的a,b都是一定的,我们可以把a行的矩阵压成一个串,每一列压成一个二进制位即可

这样就是给定n-a+1个长度为m的串,问一个长度为b的串是否是其中一个串的子串

这……后缀自动机随便做,这个点就跑得飞快了(因为这样复杂度是O(2^a*n*m+q*a*b了)

注意一下内存……

附上猥琐的代码

 type node=record
po,next:longint;
end; var trie,po:array[..,''..''] of longint;
go:array[..,..] of longint;
w,f:array[..] of longint;
p,q:array[..] of longint;
g,v:array[..,..] of longint;
e:array[..] of node;
te,last,n,m,a,b,len,ans,i,j,t,tot,k,l:longint;
c:array[..] of ansistring;
s:ansistring;
ch:char; procedure add(x,y:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
p[x]:=len;
end; procedure fill(x0,y0,x:longint);
var i,y,xx,yy:longint;
begin
i:=p[x];
while i<> do
begin
y:=e[i].po;
xx:=x0-y+;
yy:=y0-b+;
if xx> then
begin
if v[xx,yy]<>te then
begin
v[xx,yy]:=te;
g[xx,yy]:=;
end;
inc(g[xx,yy]);
if g[xx,yy]>ans then ans:=g[xx,yy];
if ans=a then exit;
end;
i:=e[i].next;
end;
end; procedure ac;
var j,h,r,x,y:longint;
c:char;
begin
h:=;
r:=;
for c:='' to '' do
if trie[,c]> then
begin
inc(r);
q[r]:=trie[,c];
f[trie[,c]]:=;
end; while h<=r do
begin
x:=q[h];
for c:='' to '' do
if trie[x,c]> then
begin
y:=trie[x,c];
inc(r);
q[r]:=y;
j:=f[x];
while (j>) and (trie[j,c]=) do j:=f[j];
f[y]:=trie[j,c];
end;
inc(h);
end;
end; procedure change(c:longint);
var q,p,np:longint;
begin
p:=go[last,c];
if w[p]=w[last]+ then last:=p
else begin
inc(t); np:=t;
w[np]:=w[last]+;
go[np]:=go[p];
f[np]:=f[p];
f[p]:=np;
q:=last;
while go[q,c]=p do
begin
go[q,c]:=np;
q:=f[q];
end;
last:=np;
end;
end; procedure ins(c:longint);
var np,nq,p,q:longint;
begin
p:=last;
inc(t); last:=t; np:=t;
w[np]:=w[p]+;
while (p<>) and (go[p,c]=) do
begin
go[p,c]:=np;
p:=f[p];
end;
if p= then f[np]:=
else begin
q:=go[p,c];
if w[q]=w[p]+ then f[np]:=q
else begin
inc(t); nq:=t;
w[nq]:=w[p]+;
go[nq]:=go[q];
f[nq]:=f[q];
f[q]:=nq; f[np]:=nq;
while go[p,c]=q do
begin
go[p,c]:=nq;
p:=f[p];
end;
end;
end;
end; procedure make(l,r,m:longint);
var i,j:longint;
begin
for j:= to m do
begin
p[j]:=;
for i:=l to r do
p[j]:=p[j]+g[i,j]*( shl (i-l));
end;
end; begin
readln(n,m,a,b);
if a> then
begin
for i:= to n do
readln(c[i]);
readln(te);
while te> do
begin
dec(te);
j:=;
trie[,'']:=;
trie[,'']:=;
t:=;
len:=;
for i:= to a do
begin
readln(s);
j:=;
for k:= to b do
begin
if trie[j,s[k]]= then
begin
inc(t); p[t]:=; w[t]:=k;
trie[t,'']:=; trie[t,'']:=;
trie[j,s[k]]:=t;
end;
j:=trie[j,s[k]];
end;
add(j,i);
end;
ac;
for i:= to t do
for ch:='' to '' do
begin
j:=i;
while (j>) and (trie[j,ch]=) do j:=f[j];
j:=trie[j,ch];
po[i,ch]:=j;
end; ans:=;
for i:= to n do
begin
j:=;
for k:= to m do
begin
if not((c[i][k]>='') and (c[i][k]<='')) then break;
if b-w[j]>m-k+ then break;
j:=po[j,c[i][k]];
if p[j]<> then
begin
fill(i,k,j);
if ans=a then break;
end;
end;
if (ans=a) or (n-i+ans<a) then break;
end;
writeln(ans div a);
end;
end
else begin
t:=;
for i:= to n do
begin
for j:= to m do
begin
read(ch);
g[i,j]:=ord(ch)-;
end;
readln;
end;
for i:= to n-a+ do
begin
make(i,i+a-,m);
last:=;
for j:= to m do
if go[last,p[j]]<> then change(p[j])
else ins(p[j]);
end;
readln(te);
while te> do
begin
dec(te);
for i:= to a do
begin
for j:= to b do
begin
read(ch);
g[i,j]:=ord(ch)-;
end;
readln;
end;
make(,a,b);
j:=;
ans:=;
for i:= to b do
if go[j,p[i]]= then
begin
ans:=;
break;
end
else j:=go[j,p[i]];
writeln(ans);
end;
end;
end.

bzoj2351 2462的更多相关文章

  1. BZOJ 2462: [BeiJing2011]矩阵模板

    2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 915  Solved: 432[Submit][Stat ...

  2. HDU 2462 The Luckiest number

    The Luckiest number Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Ori ...

  3. BZOJ2351: [BeiJing2011]Matrix

    2351: [BeiJing2011]Matrix Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 589  Solved: 171[Submit][S ...

  4. poj 2462 Period of an Infinite Binary Expansion

    欧拉定理.根据分数转换成2进制的过程,分子每次都乘2.对于循环节x,当2^x = 1(mod b)时肯定是循环节.显然当分母不能整除2的时候,即分母和2互质的话,就可以利用欧拉定理,使得2^(Eule ...

  5. BZOJ2351[BeiJing2011]Matrix——二维hash

    题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...

  6. BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)

    题目链接 序列上的Hash和前缀和差不多,二维Hash也和二维前缀和差不多了. 预处理大矩阵所有r*c的小矩阵hash值,再对询问的矩阵Hash. 类比于序列上\(s[r]-s[l-1]*pow[r- ...

  7. POJ 2462 / HDU 1154 Cutting a Polygon

    就这样莫名其妙的过了,不过可以确定之前都是被精度卡死了.真心受不了精度问题了. 题意:一条直线在一个不规则多边形内的长度,包括边重合部分. 首先计算出所有交点,然后按想x,y的大小进行二级排序. 然后 ...

  8. BZOJ 2462 矩阵模板(二维hash)

    题意:给出一个n*m的01矩阵,以及k个a*b的01矩阵,问每个是否能匹配原来的01矩阵. 由于k个矩阵的长和宽都是一样的,所以把原矩阵的所有a*b的子矩阵给hash出来.然后依次查找是否存在即可. ...

  9. 【bzoj2351】[BeiJing2011]Matrix 二维Hash

    题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...

随机推荐

  1. C# Socket连接超时设置

    问题描述:         对于C# Socket没有超时设置的选项,默认情况下进行Socket连接,返回连接失败需要20-30s时间,严重影响用户体验 问题解决: Socket服务器端: Socke ...

  2. 【BZOJ】【1013】【JSOI2008】球形空间产生器sphere

    高斯消元 高斯消元模板题 /************************************************************** Problem: 1013 User: Tun ...

  3. Matlab中unifrnd函数使用解析

    1.生成N阶[a,b]均匀分布数组 >> unifrnd(3,5,5,5) ans = 3.8651 4.6677 4.8115 4.3456 4.8560 4.0241 3.4079 3 ...

  4. hdu 1056

    水题 ~~  按题目要求直接判断~. /************************************************************************* > A ...

  5. C/C++框架和库

    http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在 ...

  6. poj 2253 Frogger (最短路变种,连通图的最长边)

    题目 这里的dijsktra的变种代码是我看着自己打的,终于把代码和做法思路联系上了,也就是理解了算法——看来手跟着画一遍真的有助于理解. #define _CRT_SECURE_NO_WARNING ...

  7. CentOS中基于不同版本安装重复包的解决方案

    http://blog.chinaunix.net/uid-21710705-id-3039675.html

  8. Code::Blocks生成的EXE文件执行错误解决:The program can't start because libgcc_s_dw2-1.dll is missing

    想用C++弄个简单东东,看有没有可行性, 开发软件,微软的太大太肿,就选用了Code::Blocks. 测试HELLO时,在工程环境中没问题的,但生成的EXE执行有问题, 报什么 libgcc_s_d ...

  9. hdu 4417 Super Mario 离线线段树

    思路:将点按值从小到大排序,询问按h从小到大排序. 在建立线段树,按h的大小更新树并得到该次查询的结果! 代码如下: #include<iostream> #include<stdi ...

  10. Android 使用系统的Activity播放音频文件 intent

    Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Inten ...