POJ3690 Constellations
嘟嘟嘟
哈希
刚开始我一直在想二维哈希,但发现如果还是按行列枚举的话会破坏子矩阵的性质。也就是说,这个哈希只能维护一维的子区间的哈希值。
所以我就开了个二维数组\(has_{i, j}\)表示原矩阵\(s_{i, j - q + 1}\)到\(s_{i, j}\)的哈希值,所以这个要用滚动哈希。
滚动哈希就是这样的:\(hash[s_{i, i + m}] = hash[s_{i + 1, j + m + 1}] * base - s_i * base ^ m\)。理解起来就是把\(s_i\)对哈希的贡献减去。
然后用同样的方法算出\(p * q\)矩阵的哈希值。最后逐行比对。
时间复杂度瓶颈在于比对复杂度\(O(n ^ 2 * p)\)。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
const ull bas = 19260817;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1e3 + 5;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
int n, m, t, p, q;
char tp[maxn];
ull has[maxn][maxn], a[maxn];
bool judge()
{
for(int i = 1; i <= n - p + 1; ++i)
for(int j = q; j <= m; ++j)
{
bool flg = 1;
for(int k = 1; k <= p && flg; ++k)
if(has[i + k - 1][j] != a[k]) flg = 0;
if(flg) return 1;
}
return 0;
}
ull quickpow(ull a, int b)
{
ull ret = 1;
for(; b; b >>= 1, a *= a)
if(b & 1) ret *= a;
return ret;
}
int main()
{
int tcnt = 0;
while(scanf("%d", &n) && n)
{
m = read(); t = read(); p = read(); q = read();
for(int i = 1; i <= n; ++i)
{
scanf("%s", tp + 1);
for(int j = 1; j <= m; ++j)
{
has[i][j] = has[i][j - 1] * bas + tp[j];
if(j >= q + 1) has[i][j] -= quickpow(bas, q) * tp[j - q];
}
}
int ans = 0;
while(t--)
{
for(int i = 1; i <= p; ++i)
{
a[i] = 0;
scanf("%s", tp + 1);
for(int j = 1; j <= q; ++j) a[i] = a[i] * bas + tp[j];
}
if(judge()) ans++;
}
printf("Case %d: %d\n", ++tcnt, ans);
}
return 0;
}
POJ3690 Constellations的更多相关文章
- POJ3690 Constellations 【KMP】
Constellations Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5044 Accepted: 983 Des ...
- POJ3690:Constellations(二维哈希)
Constellations Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6822 Accepted: 1382 题目 ...
- POJ3690:Constellations——题解
http://poj.org/problem?id=3690 题目大意:给一个图和几个子图,判断有多少种子图在原图出现过. —————————————————————— 二维哈希即可,操作看代码,我觉 ...
- 【poj3690】Constellations 哈希
传送门 题目分析 考虑将大矩阵的每个1*q矩阵哈希值求出,然后让小矩阵的第一行在大矩阵中找,如果找到,并且能匹配所有行则出现过.否则没出现过. 在初始化1*q矩阵时可以进行优化:假设该行为123456 ...
- POJ3690+位运算
题意:给定一个01矩阵.T个询问,每次询问大矩阵中是否存在这个特定的小矩阵. /* 64位的位运算!!! 题意: 给定一个01矩阵.T个询问,每次询问大矩阵中是否存在这个特定的小矩阵. (64位记录状 ...
- [poj] 3690 Constellations || 矩阵hash
原题 在大矩阵里找有几个小矩阵出现过,多组数据 将t个矩阵hash值放入multiset,再把大矩阵中每个hash值从multiset里扔出去,这样最后剩在multiset里的值就是没有找到的小矩阵, ...
- POJ 3690 Constellations (哈希)
题意:给定上一n*m的矩阵,然后的t个p*q的小矩阵,问你匹配不上的有多少个. 析:可以直接用哈希,也可以用AC自动机解决. 代码如下: #pragma comment(linker, "/ ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- CSS Sprites+CSS3 Icon Font
CSS Sprites+CSS3 Icon Font CSS Sprites在国内很多人叫CSS精灵,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来, ...
随机推荐
- SQL Server 获取(本周、本月、本旬、本季、本年)的某一天
/*------------------------------本周----------------------------------------*/ --本周第一天 ),getdate()) -- ...
- 利用三层判断sql数据库中编码是否已经存在(个人拙作,不喜勿喷)
本人.Net新手,初学三层便想记录写笔记,以供像自己一样的新人去学习,大神就不用看啦 Dal层: /// 判断编码是否存在 /// </summary> /// <param nam ...
- 三、hive JavaAPI示例
在上文中https://www.cnblogs.com/lay2017/p/9973370.html 我们通过hive shell去操作hive,本文我们以Java代码的示例去对hive执行加载数据和 ...
- iptables-linux(ls)-inode-block
Part1:iptables 环境:centos6.7 目前我只配置了INPUT.OUTPUT和FORWORD都是ACCEPT的规则 由于想要先实现防火墙规则,所以前面的内容讲的是方法,后面是详解ip ...
- tensorboard实现tensorflow可视化
1.工程目录 2.data.input_data.py的导入 在tensorflow更新之后可以进行直接的input_data的导入 # from tensorflow.examples.tutori ...
- BZOJ P4720[Noip2016]换教室____solution
题目太长不表 <--无形传送,最为致命 学习一点数学期望的基础,预处理最短路,然后加上DP即可.(废话) 理解决策和结果的差别: 在这里每阶段的决策有两个:申请|不申请 结果有两个:换|不换 然 ...
- localStorage跟cookie的使用
最近做了记住密码功能,用localStorage跟cookie都尝试用了一下,感觉都挺好哈,很方便,特此记录 html代码: <input type="text" id=&q ...
- Java设计模式—代理模式
代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下: 为其他对象提供一种代理以控制对这个对象的访问. 个人理解: 代理模式将原类进行封装, ...
- mac安装软件提示没有权限
Mac 安装软件基本是各种爽,自动更新啥. 但是有一种提示没有权限的错误,很不爽,还要sudo管理员权限 有一个修复 /usr/local目录权限的命令 sudo chown -R 'whoami' ...
- 从golang-gin-realworld-example-app项目学写httpapi (二)
https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/users/models.go 模型定义 use ...