給定乙個m行n列的01矩陣(只包含數字0或1的矩陣),再執行q次詢問,每次詢問給出乙個a行b列的01矩陣,求該矩陣是否在原矩陣**現過。
第一行四個整數m,n,a,b。
接下來乙個m行n列的01矩陣,數字之間沒有空格。
接下來乙個整數q。
接下來q個a行b列的01矩陣,數字之間沒有空格。
對於每個詢問,輸出1表示出現過,0表示沒有。
輸入3 3 2 2
111000
1113
1100
1111
0011輸出1
01對於40%的資料,a = 1。
對於80%的資料,a ≤ 10。
對於100%的資料,a ≤ 100,m,n ≤ 1000,q ≤ 1000。
這題是二維 hash,可以先看圖中的藍色矩形,假設其長為 a,寬為 b,右下角的點所在位置為 (i,j),其總的 hash 值為 s。
當其向下移動,即到了紅色方框框起的位置,其 hash 值變為了 s * p[b] + h[i+1][j] - h[i+1][j-b] * p[b] - (h[i-a][j] - h[i-a][j-b] * p[b]) * p[a * b]。
h[i+1][j] - h[i+1][j-b] * p[b] 表示向下移動所新增的部分。
(h[i-a][j] - h[i-a][j-b] * p[b]) * p[a * b] 表示向下移動後不在框內的部分,如藍色矩形最上面一行的部分。
#include
using
namespace std;
typedef
unsigned
long
long ull;
const
int n =
1005
,base=
13331
;ull p[n*n]
,h[n]
[n];
char s[n]
[n],c[n]
[n];
vector<
unsigned
long
long
> l;
intmain()
for(
int i=
1;i<=m;i++)}
for(
int i=b;i<=n;i++)if
(j>=a)}}
sort
(l.begin()
,l.end()
);int q;
scanf
("%d"
,&q)
;while
(q--)}
if(lower_bound
(l.begin()
,l.end()
,hh)
!=l.
end()&&
*lower_bound
(l.begin()
,l.end()
,hh)
==hh)
else
}return0;
}
二維陣列 字串 API
1 二維陣列 陣列中的元素,又指向乙個新的子陣列 何時使用 1.儲存橫行豎列的資料時 2.分組儲存上下級包含關係時 如何建立 1.先建立空陣列,再初始化元素為子陣列 var data data 0 0,0,0,0 data 1 0,0,0,0 何時使用 不確定子陣列的個數或內容時 2.建立時就初始化...
二維陣列 字元陣列與字串
要求 了解多維陣列的概念 掌握二維陣列的使用 掌握用字元陣列存放字串的方法 掌握字串的輸入及輸出方法 二維陣列的定義 例 int a 2 3 定義乙個二維陣列 該陣列有2行3列共6個元素 這6個元素都存放int型資料 儲存時先儲存第一行的3個元素,然後再儲存第二行的3個元素 可將此二維陣列看成是乙個...
二維陣列,字串,多維陣列
二維陣列 有2個下標的陣列成為二維陣列 定義 型別 陣列名 常量表示式1 常量表示式2 注意事項,二維陣列定義時,可以不指定第一維的長度,但必須給定第二維.例 int 3 字元陣列 用於存放字元變數的陣列成為字元陣列.字元陣列屬於一維陣列,元素型別char 例 char c 20 字元陣列串 存放字...