牛客网训练1--------矩阵 (二份+二维矩阵hash)
2024-10-15 06:30:32
不懂hash的话:https://www.cnblogs.com/ALINGMAOMAO/p/10345850.html
思路:对于一个大矩阵的每一个子矩阵都对应着一个hash值k, 当k出现2次以上时就满足要求
只是对长度进行二分就可以了。
收获:学会了hash算法
#include<iostream>
#include<map>
using namespace std;
#define ll long long
#define ull unsigned long long
const int maxn = ;
const ull base1 = ;
const ull base2 = ;
int n, m;
char mp[maxn][maxn];
ull has[maxn][maxn];
ull p1[maxn], p2[maxn];
map<ull, int>mmp; void init(){
p1[] = p2[] = ;
for (int i = ; i <= ; ++i){
p1[i] = p1[i - ] * base1;
p2[i] = p2[i - ] * base2;
}
}
void Hash(){
has[][] = ;
has[][] = ;
has[][] = ;
for (int i = ; i <= n;++i)
for (int j = ; j <= m; ++j){
has[i][j] = has[i][j-] * base1 + mp[i][j]-'a';
}
for (int i = ; i <= n;++i)
for (int j = ; j <= m; ++j){
has[i][j] = has[i - ][j] * base2 + has[i][j];
}
} bool check(int x){
mmp.clear();
for (int i = x; i <= n; ++i)
for (int j = x; j <= m; ++j){
ull k = has[i][j] - has[i - x][j] * p2[x] - has[i][j - x] * p1[x] + has[i - x][j-x] * p1[x]*p2[x];
mmp[k]++;
if (mmp[k] >= )return true;
}
return false;
} int main()
{
init();
while (cin >> n >> m){
for (int i = ; i <= n; ++i)
cin >> (mp[i] + );
Hash();
int l = , r = , ans = ;
while (l <= r){
int mid = (l + r) / ;
if (check(mid)){
l = mid + ;
ans = mid;
}
else{
r = mid - ;
}
}
cout << ans << endl;
}
}
最新文章
- ASP.NET安全
- lodop打印控件
- [UML]UML系列——类图class的依赖关系
- 【算法和数据结构】_11_小算法_itoa、ftoa及字符串倒置
- hessionproxy
- 如何用Apache TCPMon来截获SOAP消息
- svn中的图标解释
- 使用堆栈结构进行字符串表达式(";7*2-5*3-3+6/3";)的计算
- 如何在自己的Activity中去控制EditText的焦点
- Swift UI学习UITableView and protocol use
- disconf使用小结
- COMCMS_CORE 起步篇,如何运行和部署
- 【转】判断处理器是Big_endian的还是Little_endian的
- C# IIS 服务器上传图片500解决办法
- idea 自动导入包和自动将没用的包去除
- hbase源码系列(五)Trie单词查找树
- Android XML数据解析
- sql函数应用例子
- ecmall2.3.0 前后台样式等无效,导致前台页面显示不正常问题解决
- leetcode278