The Big Painting Problem's Link: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=88791 Mean: 给你两个由字符组成的矩阵,让你判断第一个矩阵在第二个矩阵中出现了多少次. analyse: 典型的二维矩阵hash. 这题有两种做法: 第一种:横向hash,然后纵向KMP.时间复杂度是O(N*(N+M)). 第二种:二维hash.直接对两个矩阵做二维hash,然后判断大矩阵的子矩阵的ha…
https://vjudge.net/problem/UVALive-6893 题意: 给出一个小矩阵和大矩阵,在大矩阵中能找到相同的小矩阵. 思路: 矩阵Hash,先对小矩阵计算出它的Hash值,然后处理大矩阵,计算出每个子矩阵的Hash值,然后和小矩阵的Hash值比较是否相等. #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<str…
原题 在大矩阵里找有几个小矩阵出现过,多组数据 将t个矩阵hash值放入multiset,再把大矩阵中每个hash值从multiset里扔出去,这样最后剩在multiset里的值就是没有找到的小矩阵,答案就是t-size了. 矩阵hash: a[i][j]为以i,j为右下角的长为p,宽为q的hash值. 先处理横行的hash,然后再把横行的hash值hash,这样就得到了矩阵的hash值.(注意行和列的base要不一样,不然很容易WA) #include<cstdio> #include<…
恩,其实大家都没有报零,反正我是蒟蒻 为了纪念我第一次打过哈希,特此写一篇题解 题目描述 从前有一个的小矩阵,矩阵的每个元素是一个字母(区分大小写),突然有一天它发生了 变异,覆盖了整个二维空间,即不停自我复制产生相同的矩阵然后无隙放置.现在二维空间 已经被它占领了,但你只被告知了大小为R*C 空间的内容(可能包含不完整的原矩阵),为了 将它恢复原状,你需要找到满足条件的面积最小的原矩阵. 奇怪的是,同时有 T 个二维空间发生了变异,你需要尽快解决这些变异. 输入格式 第一行为一个整数T,表示二…
题目链接:传送门 题解: 枚举每一行,每一行当中连续的y个我们hash 出来 那么一行就是 m - y + 1个hash值,形成的一个新 矩阵 大小是 n*(m - y + 1), 我们要找到x*y这个矩阵的 话 是不是就是 在每一列跑kmp就行了? #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define ls i&l…
不懂hash的话:https://www.cnblogs.com/ALINGMAOMAO/p/10345850.html 思路:对于一个大矩阵的每一个子矩阵都对应着一个hash值k, 当k出现2次以上时就满足要求 只是对长度进行二分就可以了. 收获:学会了hash算法 #include<iostream> #include<map> using namespace std; #define ll long long #define ull unsigned long long ;…
#include<stdio.h> #include<string.h> typedef unsigned long long ULL; ; ; int test,n,m,x,y; ULL ans; ][],a[][]; ULL hash; ULL temp[][],Temp[][]; ULL Gethash() { ULL c,d = ; ; i < x; ++i) { c = ; ; j < y; ++j) { c = c*Base1 + a[i][j]; } d…
http://www.lydsy.com/JudgeOnline/problem.php?id=1009 好神的题orzzzzzzzzzz 首先我是连递推方程都想不出的人...一直想用组合来搞..看来我是sb.. 设f[i,j]表示前i个字符匹配了前j个不吉利数字的方案,即i-j+1~i都是不吉利数字 那么答案就是sigma{f[n,i], 0<=i<m} 转移是 f[i+1,k]=sum{f[i, j],枚举i+1的字符后,k是i+1字符和不吉利数字匹配1~k,0<=k<=j}…
先用KMP处理所有的转移,或者直接暴力也可以. 然后矩阵快速幂即可. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (ll i=j;i<=k;++i) #define D(i,j,k) for (ll i=j;i>=k;--i) #define ll lo…
http://codeforces.com/contest/535/problem/D 如果真的要把m个串覆盖上一个串上面,是可以得,不会超时. 要注意到一点,全部覆盖后再判断时候合法,和边放边判断,结果是一样的,后者还更难做到. 那么就是先按顺序把串覆盖上去,已经存在的就不去覆盖了,然后kmp一次记录匹配位置,判断即可. 用DFS覆盖,DFS回溯的时候记录一个数组tonext[i]表示第i个点的第一个空位是tonext[i],这样覆盖上去就是O(n) #include <cstdio> #i…