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,参见 ...
随机推荐
- Android应用市场提交入口
应用市场是整个移动生态系统的核心,然而对于中国用户来说,Google Play应用商店却因为种种原因,在中国一直无法长期稳定的运作,又加上Android系统的开源特性,从而在中国造就出大量的第三方应用 ...
- js 正则 数值验证
function checkTextDataForNORMAL(strValue) { // 特殊字符验证格式 var regTextChar = /([\*"\'<>\/])+ ...
- Jquery-------获取网页参数
看如下代码: function getURLParameter(name) { return decodeURI( (RegExp(name + '=' + '(.+?)(&|$)').exe ...
- Careercup - Facebook面试题 - 6299074475065344
2014-05-01 01:00 题目链接 原题: Given a matrix with 's. What is the maximum area of the rectangle. In . Ho ...
- JS读取UserAgent信息并做判断
JS读取UserAgent信息并做判断 userAgent信息可以由navigator.userAgent拿到.例子: <script type="text/javascript&qu ...
- linux 下载并安装Memcache服务器端
1.下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载:http://www.danga.com/memcached/dist/memcached-1.2.2.ta ...
- Netty4.x中文教程系列(三) ChannelHandler
Netty4.x中文教程系列(四) ChannelHandler 上一篇文章详细解释了Hello World示例的代码.里面涉及了一些Netty框架的基础. 这篇文章用以解释ChannelHandl ...
- .net发送邮件代码示例
下面的代理已经调试过,用的是163的SMTP using System;using System.Collections.Generic;using System.Linq;using System. ...
- 电脑问题交流QQ群
各种电脑问题交流QQ群号 164853622 系统重装 系统恢复 系统出问题 电脑主页 修改 主页 搜狗 软件卸载 顽固 病毒 讨论
- ByteArrary(优化数据存储和数据流)
原地址:http://www.unity蛮牛.com/blog-1801-799.html 首页 博客 相册 主题 留言板 个人资料 ByteArrary(优化数据存储和数据流) 分类:unity ...