论此题哈希做法
查看原帖
论此题哈希做法
705058
BGM114514楼主2025/2/7 13:40

把方形矩阵里面的数字转化成字符串后数字间加空格存储,一个string即可代表一个子矩阵。

用set存储,查询每个子矩阵即可。

空间复杂度: n5×10=3.125×109n^5\times 10=3.125\times 10^9.

理论上会超,but AC.

Code

#include<bits/stdc++.h>
using namespace std;
int n,a[55][55];
set<string> st;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)cin>>a[i][j];
	}
	for(int z=1;z<=n;z++){
		for(int i=1;i<=n-z+1;i++){
			for(int j=1;j<=n-z+1;j++){
				string s="";
				for(int k=i;k<=i+z-1;k++){
					for(int l=j;l<=j+z-1;l++){
						int x=a[k][l];
						while(x){
							s+=(x%10)+'0';
							x/=10;
						}
						s+=' ';
					}
				}
				st.insert(s);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)cin>>a[i][j];
	}
	int ans=0;
	for(int z=1;z<=n;z++){
		for(int i=1;i<=n-z+1;i++){
			for(int j=1;j<=n-z+1;j++){
				string s="";
				for(int k=i;k<=i+z-1;k++){
					for(int l=j;l<=j+z-1;l++){
						int x=a[k][l];
						while(x){
							s+=(x%10)+'0';
							x/=10;
						}
						s+=' ';
					}
				}
				if(st.find(s)!=st.end()){
					ans=z;
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

望卡。

2025/2/7 13:40
加载中...