*【牛客 1 - A】矩阵(字符串hash)

题干:
 

给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。

输入描述:

第一行两个整数n, m代表矩阵的长和宽;
接下来n行,每行m个字符(小写字母),表示矩阵;

输出描述:

输出一个整数表示满足条件的最大正方形的边长。

示例1

输入

复制

5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl

输出

复制

3

备注:

对于30%的数据,n,m≤100;
对于100%的数据,n,m≤500;

解题报告:

   非常恶心的字符串Hash,,琢磨了半天才看明白、、这种前缀的是需要去模数的

AC代码:

//#include<cstdio>
//#include<iostream>
//#include<algorithm>
//#include<queue>
//#include<map>
//#include<vector>
//#include<set>
//#include<string>
//#include<cmath>
//#include<cstring>
//using namespace std;
//typedef unsigned long long ull;
//typedef pair<int,int>P;
//#define maxn 505
//int n,m;
//char s[maxn][maxn];
//ull h[maxn][maxn],b[maxn*maxn],base=10007,hhh[maxn][maxn];
//inline int ID(int i,int j) {
//	return (i-1)*m+j;
//}
//inline bool check(int mid) {
//	map<ull,int>M;
//	for(int x=1; x<=n-mid+1; x++)
//		for(int y=1; y<=m-mid+1; y++) {
//			int xx=x+mid-1,yy=y+mid-1;
//			ull val=(h[xx][yy]-h[xx][y-1]-h[x-1][yy]+h[x-1][y-1])*b[(n-x)*m+m-y];
//			if(M.find(val)!=M.end())return 1;
//			M[val]=1;
//		}
//	return 0;
//}
//int main() {
//	scanf("%d%d",&n,&m);
//	for(int i=1; i<=n; i++)scanf("%s",s[i]+1);
//	b[0]=1;
//	for(int i=1; i<=n; i++)
//		for(int j=1; j<=m; j++) {
//			h[i][j]=h[i][j-1]+b[ID(i,j-1)]*(s[i][j]-'a');
//			b[ID(i,j)]=b[ID(i,j-1)]*base;
//		}for(int j=1; j<=m; j++)for(int i=1; i<=n; i++)h[i][j]+=h[i-1][j];
//	int l=0,r=min(n,m),mid,ans=0;
//	while(l<=r) {
//		mid=(l+r)/2;
//		if(check(mid))ans=mid,l=mid+1;
//		else r=mid-1;
//	}
//	printf("%d\n",ans);
//	return 0;
//}#include<cstdio>
#include<algorithm>
#define N 510
using namespace std;
typedef unsigned long long ll;
const ll D1=97,D2=131;
int n,m,i,j,l,r,mid,ans,t;
char a[N][N];
ll pow1[N],pow2[N],h[N][N],tmp,Hash[N*N];
bool check(int x) {t=0;for(i=1; i<=n; i++) {for(tmp=0,j=1; j<x; j++) tmp=tmp*D1+a[i][j],h[i][j]=0;for(j=x; j<=m; j++) h[i][j]=tmp=tmp*D1-pow1[x]*a[i][j-x]+a[i][j];}for(t=0,i=x; i<=m; i++) {for(tmp=0,j=1; j<x; j++) tmp=tmp*D2+h[j][i];for(j=x; j<=n; j++) Hash[t++]=tmp=tmp*D2-pow2[x]*h[j-x][i]+h[j][i];} sort(Hash,Hash+t);for(i=1; i<t; i++) {if(Hash[i-1]==Hash[i])return 1;}return 0;
}
int main() 
{scanf("%d%d",&n,&m);for(i=1; i<=n; i++) {scanf("%s",a[i]+1);for(j=1; j<=m; j++) {a[i][j]-='a';}}l=1,r=min(n,m);pow1[0]=pow2[0]=1;for(i=1; i<=n; i++) pow1[i]=pow1[i-1]*D1;for(i=1; i<=m; i++) pow2[i]=pow2[i-1]*D2;while(l<=r) {mid=(l+r)>>1;if(check(mid)) l=mid+1,ans=mid;else r=mid-1;	}printf("%d",ans);return 0;
}

AC代码3:(还是这种二维Hash看得懂一点)

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn=2e6+10;
const ull base1=131,base2=233; //base,基数int n, m;
char mp[510][510];
ull has[510][510];
ull p1[510], p2[510];
map<ull, int> 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(~scanf("%d%d", &n, &m)){for(int i = 1; i <= n; i ++){scanf("%s", 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;}}printf("%d\n", ans);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

*【洛谷 - P1025】数的划分(dfs 或 dp 或 母函数,第二类斯特林数Stirling)

题干&#xff1a; 题目描述 将整数n分成k份&#xff0c;且每份不能为空&#xff0c;任意两个方案不相同(不考虑顺序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 1,1,5 1,5,1 5,1,1 问有多少种不同的分法。 输入输出格式 输入格式&am…

kali linux 截图 软件,Kali-Linux-Tools-Interface:针对Kali Linux的图形化Web接口

Kali-Linux-Tools-Interface在当今这个信息时代&#xff0c;数据是最有价值的资产&#xff0c;因此&#xff0c;广大用户和企业已成为网络攻击的主要目标。众所周知&#xff0c;信息安全专业人员都会使用一系列技术工具来协助他们的活动。但是设置环境&#xff0c;安装这些工具…

【牛客 - 188D 】愤怒(01滚动数组优化dp,括号匹配方案个数,tricks)

题干&#xff1a; 小w很生气 小w有一个长为n的括号序列 愤怒小w想把这个括号序列分为两个括号序列 小w想让分为的这两个括号序列同时合法 小w想知道一共有多少种划分方案 (划分的意思是划分为两个子序列) 注意两个序列是 A,B 和 两个序列是B,A 算两种方案,也就是同一位置位…

android adb 开机广播,Android中常用的adb指令

1、安装apkadb install filename.apk如:adb install C:\Users\zhijianhulian\Desktop\keystore\kingoroot.apk2、卸载apkadb uninstall apk包名如&#xff1a;adb uninstall com.kingoroot.cn3、启动activityadb shell am start -n 包名/activity完整包名地址如&#xff1a;adb…

ACM所有算法大全(持续更新)

转载自&#xff1a; http://blog.sina.com.cn/s/blog_adb6743801019h29.html ACM 所有算法 数据结构 栈&#xff0c;队列&#xff0c;链表哈希表&#xff0c;哈希数组堆&#xff0c;优先队列 双端队列 可并堆 左偏堆二叉查找树 Treap 伸展树并查集 集合计数问题 二分图的识别平…

android布局属性,Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline...

相信大家对LinearLayout已经相当熟悉&#xff0c;但你们是否了解它的属性baselineAligned呢&#xff1f;Android官方文档是这么描述的&#xff1a;那到底这个属性是做什么用的呢&#xff1f;baselineAligned:基准线对齐。首先要解释什么是基准线&#xff0c;这个在中文中不常见…

【CodeForces - 1105C】Ayoub and Lost Array(线性计数dp)

题干&#xff1a; Ayoub had an array aa of integers of size nn and this array had two interesting properties: All the integers in the array were between ll and rr (inclusive).The sum of all the elements was divisible by 33. Unfortunately, Ayoub has lost h…

【牛客 - 373C】抓捕盗窃犯(连通图,思维,dfs 或 并查集)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/373/C 来源&#xff1a;牛客网 Q市发生了一起特大盗窃案。这起盗窃案是由多名盗窃犯联合实施的,你要做的就是尽可能多的抓捕盗窃犯。 已知盗窃犯分布于 N N个地点,以及第 i i个地点初始有 ai ai名盗…

android取消自动调试模式吗,Android进入调试模式的三种技巧

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;Android开发过程中难免会遇到各种问题&#xff0c;通常我们会通过打印Log日志或者Debug模式来分析问题。这里介绍下Android程序进入到Debug的多种方式&#xff0c;…

IMX6怎么移植最新Android,[IMX6Q][Android5.1]移植筆記 --- 無法掛載system文件系統

platform: imx6qos: Android5.1branch: l5.1.1_2.1.0-ga編譯好system image之后開機提示如下log&#xff0c;注意紅色部分:Freeing unused kernel memory: 432K (c0be3000 - c0c4f000)usb 1-1: USB disconnect, device number 2Console: switching to colour dummy device 80x3…

【牛客 - 373A】翻硬币问题(博弈,结论,分析)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/373/A 来源&#xff1a;牛客网 Alice和Bob正在玩一个很经典的游戏。 有 n n个硬币初始时全部正面朝上&#xff0c;每一轮Alice必须选择其中任意的恰好 m m枚硬币并将它们全部翻转&#xff0c;如果若…

opera android 7,Opera迷你浏览器 Opera Mini 7

包名&#xff1a;com.opera.mini.android全新的界面Opera Mini 6在所有地方都有了全新的形象.新的设计、新的皮肤,还有新的缩放和跳转按键,这都让Opera Mini 6变得更加好用分享功能Opera Mini 6中你可以将感兴趣的内容分享到你所在社交平台中去触屏的双指缩放这次Opera也支持触…

【POJ - 1456】Supermarket (贪心,优先队列 或并查集)

题干&#xff1a; A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precis…

【CodeForces - 558C】Amr and Chemistry(位运算,bfs,计数,思维,tricks)

题干&#xff1a; Amr loves Chemistry, and specially doing experiments. He is preparing for a new interesting experiment. Amr has n different types of chemicals. Each chemical i has an initial volume of ailiters. For this experiment, Amr has to mix all th…

axure 转换为html,AxureRP教程AxureRP如何生成HTML文件

1.正常打开一份已经设计好的RP&#xff0c;如下截图所示&#xff1a;2.点击上方菜单的“发布”按钮&#xff0c;在弹出的选项中单击“生成HTML文件”&#xff0c;详细操作如下图标红位置。3.在弹出的新窗口中&#xff0c;可以设定HTML文件保存的文件夹位置&#xff0c;这个位置…

【牛客 - 373B】666RPG(线性计数dp)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/373/B 来源&#xff1a;牛客网 在欧美&#xff0c;“666”是个令人极其厌恶和忌讳的数&#xff0c;被称为“野兽数”。 相传&#xff0c;尼禄&#xff0c;这位历史上以暴君著称的古罗马皇帝&#xff0…

我家云刷android系统教程,我家云刷机教程——小白详细版(篇二)

#大男孩的快乐#征稿活动火热进行中。只要投稿就有50金币等你拿&#xff0c;更有三千元乐高大奖与达人Z计划专属权益等待优秀的你~>活动详情戳这里<前两天发了一篇我家云的刷机教程&#xff0c;没想到大家这么有兴趣&#xff0c;讨论的异常激烈。看了大家的评论才发现之前…

【Loj - 515】贪心只能过样例(暴力,或01背包 + bitset)

题干&#xff1a; 题目描述 输入格式 第一行一个数 n。 然后 n 行&#xff0c;每行两个数表示 ai​,bi​。 输出格式 输出一行一个数表示答案。 样例 样例输入 5 1 2 2 3 3 4 4 5 5 6 样例输出 26 数据范围与提示 解题报告&#xff1a; 注意到要求统计种类数&#xf…

html5文件域的自动获取,HTML5 文件域+FileReader 读取文件(一)

在HTML5以前&#xff0c;HTML的文件上传域的功能具有很大的局限性&#xff0c;这种局限性主要体现在如下两点&#xff1a;每次只能选择一个文件进行上传客户端代码只能获取被上传文件的文件路径&#xff0c;无法访问实际的文件内容一、FileList对象和File对象HTML5为typefile 的…

计算几何 模板

计算几何模板&#xff1a; #include<iostream> #include<algorithm> #include<queue> #include<cstdio> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #d…