星座
給定乙個由』'和』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的點的座標與可能放置的數字的個數,從少往多遍歷,這樣能有效的減小搜尋樹的規模。剪枝優化待更...