bzoj2351 2462
我没写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的更多相关文章
- BZOJ 2462: [BeiJing2011]矩阵模板
2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 915 Solved: 432[Submit][Stat ...
- HDU 2462 The Luckiest number
The Luckiest number Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Ori ...
- BZOJ2351: [BeiJing2011]Matrix
2351: [BeiJing2011]Matrix Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 589 Solved: 171[Submit][S ...
- poj 2462 Period of an Infinite Binary Expansion
欧拉定理.根据分数转换成2进制的过程,分子每次都乘2.对于循环节x,当2^x = 1(mod b)时肯定是循环节.显然当分母不能整除2的时候,即分母和2互质的话,就可以利用欧拉定理,使得2^(Eule ...
- BZOJ2351[BeiJing2011]Matrix——二维hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
- BZOJ.2462.[BeiJing2011]矩阵模板(二维Hash)
题目链接 序列上的Hash和前缀和差不多,二维Hash也和二维前缀和差不多了. 预处理大矩阵所有r*c的小矩阵hash值,再对询问的矩阵Hash. 类比于序列上\(s[r]-s[l-1]*pow[r- ...
- POJ 2462 / HDU 1154 Cutting a Polygon
就这样莫名其妙的过了,不过可以确定之前都是被精度卡死了.真心受不了精度问题了. 题意:一条直线在一个不规则多边形内的长度,包括边重合部分. 首先计算出所有交点,然后按想x,y的大小进行二级排序. 然后 ...
- BZOJ 2462 矩阵模板(二维hash)
题意:给出一个n*m的01矩阵,以及k个a*b的01矩阵,问每个是否能匹配原来的01矩阵. 由于k个矩阵的长和宽都是一样的,所以把原矩阵的所有a*b的子矩阵给hash出来.然后依次查找是否存在即可. ...
- 【bzoj2351】[BeiJing2011]Matrix 二维Hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
随机推荐
- openstack安装、卸载与启动
一.安装: 更新: sudo apt-get update sudo apt-get upgrade 安装图形化界面: sudo apt-get install ubuntu-desktop 安装gc ...
- Oracle 删除表分区
删除表分区(drop partition) 删除表分区包含两种操作,分别是: Ø 删除分区:alter table [tbname] drop partition [ptname] UPDA ...
- java递归查询方法
一.需求 项目里要让用户能够设置所选择教材的章课节,以针对章课节提供相应的题目供用户做题. 设计:用户设置了教材后,首次登录,进行章节设置时.默认为用户选择第一章.第一课.第一节. 思路:用户访问页面 ...
- 20160723数据结构节alexandrali
大坑最后再填. 20160803:心情好回来填啦(5/7) 做的题目是: poj2970 我们先每个人都不给钱qwq 然后我们发现有一位的工作时间超过了d 那么我们就从以前安排过工作的人里,a最大的, ...
- [转载]C#获取本机IPv4地址
C#获取本机IP地址在C#1.0之后都使用下面的这种形式: IPHostEntry ipe = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipa=i ...
- 基于Pre-Train的CNN模型的图像分类实验
基于Pre-Train的CNN模型的图像分类实验 MatConvNet工具包提供了好几个在imageNet数据库上训练好的CNN模型,可以利用这个训练好的模型提取图像的特征.本文就利用其中的 “im ...
- node-firefox 二三事
编者按:本文作者为 Soledad Penadés, Sole 在 Mozilla 的 Tech Evangelism 团队工作,帮助人们在网络上创造神奇的东西.本文主要介绍node-firefox的 ...
- hdoj 2202 最大三角形
题目大意:给定n(3<=n<=50000)个点,求其中任意三个点组成的三角形面积最大,输出该面积. 题目传送:http://acm.hdu.edu.cn/showproblem.php?p ...
- 在UWSGI和NGINX配合的情况下,配置个别目录上传及超时
笨办法就是多加一个LOCATION. 然后,自定义以下类似参数 client_max_body_size uwsgi_connect_timeout uwsgi_read_timeout server ...
- 解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790 参考文章:http://blog.sina.com.cn/s/b ...