国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj 1567: [JSOI2008]Blue Mary的戰役地圖 (二分+hash)

2019-11-08 02:13:01
字體:
來源:轉載
供稿:網友

1567: [JSOI2008]Blue Mary的戰役地圖

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 882  Solved: 507[Submit][Status][Discuss]

Description

Blue Mary最近迷上了玩Starcraft(星際爭霸) 的RPG游戲。她正在設法尋找更多的戰役地圖以進一步提高自己的水平。 由于Blue Mary的技術已經達到了一定的高度,因此,對于用同一種打法能夠通過的戰役地圖,她只需要玩一張,她就能了解這一類戰役的打法,然后她就沒有興趣再玩兒這一類地圖了。而網上流傳的地圖有很多都是屬于同一種打法,因此Blue Mary需要你寫一個程序,來幫助她判斷哪些地圖是屬于同一類的。 具體來說,Blue Mary已經將戰役地圖編碼為n*n的矩陣,矩陣的每個格子里面是一個32位(有符號)正整數。對于兩個矩陣,他們的相似程度定義為他們的最大公共正方形矩陣的邊長。兩個矩陣的相似程度越大,這兩張戰役地圖就越有可能是屬于同一類的。

Input

第一行包含一個正整數n。 以下n行,每行包含n個正整數,表示第一張戰役地圖的代表矩陣。 再以下n行,每行包含n個正整數,表示第二張戰役地圖的代表矩陣。

Output

僅包含一行。這一行僅有一個正整數,表示這兩個矩陣的相似程度。

Sample Input

31 2 34 5 67 8 95 6 78 9 12 3 4

Sample Output

2

HINT

樣例解釋:子矩陣:5 68 9為兩個地圖的最大公共矩陣約定:n<=50

Source

[Submit][Status][Discuss]
HOME Back

題解:二分+hash

二分答案,然后利用hash值判定,做法十分的暴力,但是時間復雜度不是嚴格的,所以過掉了。

其實可以預處理出第一個大矩陣的所以小矩陣,然后二分查找。

#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdio>#define ull unsigned long long#define p 2000001001#define N 53using namespace std;ull a[N][N][N],b[N][N][N],mi[N];int mpa[N][N],mpb[N][N],n;bool check(int x){	for (int i=1;i<=n-x+1;i++)	 for (int j=1;j<=n-x+1;j++)	  for (int k=1;k<=n-x+1;k++)	   for (int l=1;l<=n-x+1;l++) {	   	 bool pd=true;	   	 for (int t=1;t<=x;t++) 	   	 	if (a[i+t-1][j][j+x-1]!=b[k+t-1][l][l+x-1]) {	   	 	 //cout<<a[i][j][j-x+1]<<" "<<b[k][l][l+x-1]<<endl;	   	 	 pd=false;			 break;	 		    }		// if (pd) cout<<i<<" "<<j<<" "<<k<<" "<<l<<endl;		 if (pd) return 1;	   }	return 0;}int main(){	freopen("a.in","r",stdin);	freopen("my.out","w",stdout);	scanf("%d",&n);	for (int i=1;i<=n;i++) 	 for (int j=1;j<=n;j++) scanf("%d",&mpa[i][j]);	for (int i=1;i<=n;i++)	 for (int j=1;j<=n;j++) scanf("%d",&mpb[i][j]);	for (int i=1;i<=n;i++)	 for (int j=1;j<=n;j++) {	 	a[i][j][j]=mpa[i][j]*p;	 	for (int k=j+1;k<=n;k++)	 	 a[i][j][k]=a[i][j][k-1]*p+mpa[i][k];	 }	for (int i=1;i<=n;i++) 	 for (int j=1;j<=n;j++) {	 	b[i][j][j]=mpb[i][j]*p;	 	for (int k=j+1;k<=n;k++) 	 	 b[i][j][k]=b[i][j][k-1]*p+mpb[i][k];	 }	int l=1; int r=n; int ans=0;	while (l<=r) {		int mid=(l+r)/2;		if (check(mid)) ans=max(ans,mid),l=mid+1;		else r=mid-1;	}	PRintf("%d/n",ans);}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丽水市| 柏乡县| 丰都县| 南皮县| 油尖旺区| SHOW| 刚察县| 南溪县| 安仁县| 临西县| 翼城县| 北流市| 调兵山市| 丹棱县| 吉林市| 中西区| 依兰县| 怀仁县| 镇安县| 吴江市| 盐边县| 辉县市| 栾城县| 祁东县| 新津县| 甘德县| 石泉县| 墨玉县| 巴青县| 延川县| 和顺县| 曲水县| 尚志市| 承德市| 澄城县| 满洲里市| 黄龙县| 临沧市| 阳朔县| 大竹县| 明溪县|