演算法分析
解題**
錯題總結
給出乙個n * m的矩陣。讓你從中發現乙個最大的正方形。使得這樣子的正方形在矩陣**現了至少兩次。輸出最大正方形的邊長。
第一行兩個整數n, m代表矩陣的長和寬;接下來n行,每行m個字元(小寫字母),表示矩陣;
輸出乙個整數表示滿足條件的最大正方形的邊長。
> 5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl
3
對於30%的資料,n,m≤100;看到這題,我居然以為是暴力,還是太菜了對於100%的資料,n,m≤500;
這道題的核心思想在於hash + 二分
就是一道二維hash的模版題目,關鍵在於二分正方形的邊長。
#include
#include
using
namespace std;
typedef
unsigned
long
long ull;
ull base1 =
131,base2 =
233;
ull has[
505]
[505];
//hash值儲存
ull p1[
505]
,p2[
505]
;//p1為列的偏移值 p2為行的偏移值
char mp[
505]
[505];
int n,m;
mapint> mmp;
//輔助記錄這個正方形hash值存在的個數
//初始化hash輔助陣列
void
init()
}//初始化hash輔助陣列
//對二維矩陣進行hash變換
void
init_hash()
}//對行進行hash
for(
int i =
1; i <= n; i++)}
}//對二維矩陣進行hash變換
//遍歷尋找是否存在兩個以上正方形相等
intcheck
(int x)
return0;
}//遍歷尋找是否存在兩個以上正方形相等
intmain()
else
r = mid -1;
}//對正方形的邊長進行二分。
cout << ans << endl;
}return0;
}
hash演算法
牛客練習賽1
a矩陣 題意 給出乙個n m的矩陣。讓你從中發現乙個最大的正方形。使得這樣子的正方形在矩陣 現了至少兩次。輸出最大正方形的邊長。n 500,m 500 題解 考慮暴力 列舉每個矩陣為 n 3 然後判斷兩個矩陣是否相等 n 2 顯然複雜度 如果將矩陣進行hash 然後o 1 判斷兩個矩陣是否相等,那麼...
牛客練習賽22題解
簡單瞎搞題 不會用bitset,所以沒做出來。實際上還是比較簡單的。include using namespace std bitset 1000005 dp 2 int main cout 2 count 簡單資料結構1 這裡要運用拓展尤拉定理。ab modp ab p b p p 0 modp ...
題解 牛客練習賽51
字首a的數量,字尾c的數量,遇到b就計算一次答案。includeusing namespace std typedef long long ll const int n 1e5 100 char s n int cnt n int main int tmp 0 for int i 1 i n i p...