我没写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. bndtools教程

    使用工具编程的确能给人们带来很多便利,但是在不会用之前,且缺乏相应的中文资料让你去了解时,真是一种折磨,同时也是一种挑战. bndTools其实就是用来开发OSGi的一个工具,它为开发提供了便利,具体 ...

  2. How does java technology relate to cloud computing?

    Java Paas shootout   (@IBM developer) Cloud computing is always a hot topic around IT field today.Ho ...

  3. 3563: DZY Loves Chinese - BZOJ

    Description神校XJ之学霸兮,Dzy皇考曰JC.摄提贞于孟陬兮,惟庚寅Dzy以降.纷Dzy既有此内美兮,又重之以修能.遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上有N座祭 ...

  4. shell uniq sort -u 去重排序

    sort -u 和 uniq都能起到删除重复信息的功能,那么他们的区别究竟在哪呢? $ cat test jason jason jason fffff jason 下面分别执行三个命令 :sort ...

  5. jquery(1.3.2)<--json-->spring(3.0)

    发现spring 3已经对ajax支持的很好了,前端可以只使用html+jquery,后端 只使用spring再加上一种orm,两者之间用json交换数据就可以了,现在是放弃 jsp,struts这些 ...

  6. 提高jQuery执行效率需要注意几点

    1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...

  7. log4j记录exception异常有价值信息及log4j级别

    try{ }catch(Exception e){ e.printStackTrace(); log.error("配件导出excel错误:", e.fillInStackTrac ...

  8. Web Server 和 HTTP协议(转)

    转自:http://www.kuqin.com/shuoit/20150809/347488.html 一直在找实习,有点什么东西直接就在evernote里面记了,也没时间来更新到这里.找实习真是个蛋 ...

  9. POJ 1258 Agri-Net(最小生成树,模板题)

    用的是prim算法. 我用vector数组,每次求最小的dis时,不需要遍历所有的点,只需要遍历之前加入到vector数组中的点(即dis[v]!=INF的点).但其实时间也差不多,和遍历所有的点的方 ...

  10. lintcode:在二叉查找树中插入节点

    题目:  在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树.  样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样 ...