bzoj2351 Matrix(二維雜湊)

2021-09-26 02:59:09 字數 1373 閱讀 8645

description 

給定乙個m行n列的01矩陣,以及q個a行b列的01矩陣,你需要求出這q個矩陣哪些在原矩陣**現過。 

所謂01矩陣,就是矩陣中所有元素不是0就是1。 

input 

輸入檔案的第一行為m、n、a、b,參見題目描述。 

接下來m行,每行n個字元,非0即1,描述原矩陣。 

接下來一行為你要處理的詢問數q。 

接下來q個矩陣,一共q*a行,每行b個字元,描述q個01矩陣。 

output 

你需要輸出q行,每行為0或者1,表示這個矩陣是否出現過,0表示沒有出現過,1表示出現過。 

sample input 

3 3 2 2 

111 

000 

111 

3 11 

00 11 

11 00 

11 sample output 

1 0 

1 hint 

對於100%的實際測試資料,m、n ≤ 1000,q = 1000 

對於40%的資料,a = 1。 

對於80%的資料,a ≤ 10。 

對於100%的資料,a ≤ 100。 

#includeusing namespace std;

#define ull unsigned long long

#define n 1010

#define k1 11113

#define k2 11117

int n,m,a,b,q;

mapmp;

ull hs[n][n],bin1[n],bin2[n];

char s[n];

int main()

for(int i=1;i<=n;++i)

for(int j=1;j<=m;++j)

hs[i][j]+=hs[i-1][j]*k2;

for(int i=1;i<=n;++i)

bin2[i]=bin2[i-1]*k2;

for(int i=1;i<=m;++i)

bin1[i]=bin1[i-1]*k1;

for(int i=a;i<=n;++i)

for(int j=b;j<=m;++j)

mp[hs[i][j]-hs[i-a][j]*bin2[a]-hs[i][j-b]*bin1[b]+hs[i-a][j-b]*bin2[a]*bin1[b]]=1;///容斥

scanf("%d",&q);

while(q--)

if(mp[res]) printf("1\n");

else printf("0\n");

}return 0;

}

BZOJ2351Matrix (矩陣) 二維雜湊

給定乙個m行n列的01矩陣 只包含數字0或1的矩陣 再執行q次詢問,每次詢問給出乙個a行b列的01矩陣,求該矩陣是否在原矩陣 現過。輸入格式 第一行四個整數m,n,a,b。接下來乙個m行n列的01矩陣,數字之間沒有空格。接下來乙個整數q。接下來q個a行b列的01矩陣,數字之間沒有空格。輸出格式 對於...

POJ 3685(Matrix,二分搜尋)

題意 給定乙個 n n矩陣,其中aij i2 100000 i j 2 100000 j i j。求矩陣中第 k大的數。題解 自然的想法還是算出來所有的 aij,排序,然後二分找第 k大的數,時間複雜度又來打了o n2 肯定會超時。注意觀察aij i2 100000 i j 2 100000 j i...

poj 3685 Matrix 二分套二分

題意 說的很明確了。思路 很經典的二分套二分,通過觀察表示式我們可以發現當j一定的時候,原表示式的值是跟i相關並且是單調的,所以我們可以二分答案m,然後統計比m小的數有多少個,在統計的時候需要先列舉j,然後再二分i,統計完成後,還需要判斷這個結果是否存在 即是否存在i,j使表示式的值等於m 為此我的...