博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客网训练1--------矩阵 (二份+二维矩阵hash)
阅读量:5923 次
发布时间:2019-06-19

本文共 1577 字,大约阅读时间需要 5 分钟。

不懂hash的话:

思路:对于一个大矩阵的每一个子矩阵都对应着一个hash值k, 当k出现2次以上时就满足要求

   只是对长度进行二分就可以了。

收获:学会了hash算法

#include
#include
using namespace std;#define ll long long#define ull unsigned long longconst int maxn = 510;const ull base1 = 131;const ull base2 = 233;int n, m;char mp[maxn][maxn];ull has[maxn][maxn];ull p1[maxn], p2[maxn];map
mmp;void init(){ p1[0] = p2[0] = 1; for (int i = 1; i <= 505; ++i){ p1[i] = p1[i - 1] * base1; p2[i] = p2[i - 1] * base2; }}void Hash(){ has[0][0] = 0; has[0][1] = 0; has[1][0] = 0; for (int i = 1; i <= n;++i) for (int j = 1; j <= m; ++j){ has[i][j] = has[i][j-1] * base1 + mp[i][j]-'a'; } for (int i = 1; i <= n;++i) for (int j = 1; j <= m; ++j){ has[i][j] = has[i - 1][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] >= 2)return true; } return false;}int main(){ init(); while (cin >> n >> m){ for (int i = 1; i <= n; ++i) cin >> (mp[i] + 1); Hash(); int l = 0, r = 600, ans = 0; while (l <= r){ int mid = (l + r) / 2; if (check(mid)){ l = mid + 1; ans = mid; } else{ r = mid - 1; } } cout << ans << endl; }}

 

转载于:https://www.cnblogs.com/ALINGMAOMAO/p/10345873.html

你可能感兴趣的文章
关于nand flash的地址 A8,寻址
查看>>
Windows Azure Cloud Service (22) Web Role的Full IIS特性
查看>>
HtmlWeb类
查看>>
LINQ之路12:LINQ Operators之数据转换(Projecting)
查看>>
OpenGL ES for Windows Mobile
查看>>
centos 6.8操作系统安装arcgis server 10.4
查看>>
Raspberrypi安装使用开发简要说明
查看>>
(step8.2.4)hdu 1846(Brave Game——巴什博奕)
查看>>
oracle11g rac asm 实例内存修改
查看>>
SQL Server:数据库角色
查看>>
多标签主界面使用TRzPageControl
查看>>
对技术的态度—CoolShell 陈皓
查看>>
佛家十大经典禅语
查看>>
DinnerNow案例分析
查看>>
Web Farm和Web Garden的区别
查看>>
STL - 迭代器 - 安插型迭代器
查看>>
IIs7 报错
查看>>
POJ 1739 Tony's Tour(插头DP)
查看>>
设计模式
查看>>
科学版欲望都市:爱与性的实验报告
查看>>