字串hash Matrix(二維)

2021-10-23 17:22:08 字數 1538 閱讀 3673

給定乙個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 字元陣列串 存放字...