星座 POJ3690 詳解

2021-08-19 09:40:56 字數 1455 閱讀 7641

星座

給定乙個由』'和』0』組成的,大小為 n x m (n行m列)的匹配物件和 t個大小為 p x q的匹配模式。

請輸出在匹配物件中至少出現過一次的匹配模式的個數。

思路:這裡要做的不是字串匹配,而是二維網路匹配,同樣可以運用迴圈雜湊,首先把每一行看成乙個字串,計算從每個位置開始長度為q的字串子串的雜湊值。然後再把得到的雜湊值在列方向看成乙個字串,計算從每乙個位置開始長度為p的字串子串的雜湊值。這樣,我們高效地計算得到了所有pxq的子陣的雜湊值。在兩次雜湊值地計算中,我們運用了不同的基數。

題意:給出乙個nm的大矩陣。在給出t個p*q的小矩陣,問有多少個小矩陣在大矩陣中出現過。

思路:二維hash。算出整個矩陣的所有的p*q小矩陣的hash值,同時求出目標矩陣的hash值,判斷該值是否出現即可。

複雜度:n * m * k

/*

星座給定乙個由'*'和'0'組成的,大小為 n x m (n行m列)的匹配物件和

t個大小為 p x q的匹配模式。

請輸出在匹配物件中至少出現過一次的匹配模式的個數。

*/#include#include#includeusing namespace std;

typedef unsigned long long ull;

const int max_size = 1005;

const int max_t = 105;

//輸入

int n,m,t,p,q,tt=0;

char field[max_size][max_size];//匹配物件

char patterns[max_t][max_size][max_size];//匹配模式

ull hash[max_size][max_size],tmp[max_size][max_size];

//計算 a的所有 p x q子陣對應的雜湊值

void compute_hash(char a[max_size][max_size],int n,int m)

//將出現的雜湊值從 multiset中刪除

compute_hash(field,n,m);

for(int i=0;i+p<=n;i++)

} //通過相減得到出現的模式的個數

int ans = t - unseen.size();

printf("case %d: %d\n",++tt,ans);

} /*

3 3*00

0***00

2 2 2

**00

*0**

*/int main()

for(int i=0;i

} solve();

} return 0;

}

POJ3690 字串雜湊 星座

題目大意就是給出乙個n m的矩陣,矩陣中只有一些 或者0,n 1000,m 1000 然後有t t 100 個詢問,每次詢問給出乙個p q的矩陣,p,q是提前固定的數值。問這些詢問中是大矩陣的子矩陣的有幾個 如果暴力查詢,時間複雜度為t n m p q。用雜湊優化一下,我們每次詢問的時候把詢問的矩陣...

poj 3690(二維雜湊)

感覺二維雜湊的思想跟一維的差不多,比如要匹配的字串是p q的大小,先儲存好以下標為i,j為一列的末尾元素的hash值,然後一q大小的列 進行 行的拓展,行列的思想都一樣,滾動。include include include include includeusing namespace std typ...

POJ2676 Sudoku 詳解優化

思路是很簡單的,類似於八皇后問題 暴力搜 用h i j 標記第i行中是否存在j 同理,l i j 標識第i列中是否存在j k i j 第i個方塊中是否存在j 難的是如何進行剪枝,可行的乙個方法是記錄每個初始為0的點的座標與可能放置的數字的個數,從少往多遍歷,這樣能有效的減小搜尋樹的規模。剪枝優化待更...