列表

详情


NC209824. 社团游戏

描述

在民风淳朴的雏见泽,号称能“完美犯罪”的天才牛牛,又开始和社团的萌妹子牛妹玩起了游戏。

在今天的游戏中,牛牛将会得到一个且全为小写字母的矩阵,他可以从矩阵中任选一块正方形,但必须保证该正方形中任意一类小写字母个数之和不能超过,换而言之,在该正方形中,‘a’字符个数不能超过,‘b’字符个数不能超过,…,‘z’字符个数不能超过

现在牛牛想知道,以为左上角且符合以上要求的正方形中,边长最大的是多少?


输入描述

第一行三个正整数,,,其中:

接下来行,每行个小写字母。

输出描述

输出行,每行个数字。其中第行第个数字表示,以为左上角且符合题目要求的正方形的最大边长。

示例1

输入:

3 3 2
aaa
bcd
efg

输出:

2 2 1
2 2 1
1 1 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 230ms, 内存消耗: 27552K, 提交时间: 2021-03-04 20:45:10

#include<bits/stdc++.h>
using namespace std;
char mp[505][505];
int s[26][505][505],n,m,k;
inline bool ck(int x,int y,int l){
	for(int i=0;i<26;++i)
		if(s[i][x][y]-s[i][x-l][y]-s[i][x][y-l]+s[i][x-l][y-l]>k)return 0;
	return 1;
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;++i)
		cin>>mp[i]+1;
	for(int l=0;l<26;++l)
		for(int i=1;i<=n;++i)
			for(int j=1;j<=m;++j)
				s[l][i][j]=s[l][i-1][j]+s[l][i][j-1]-s[l][i-1][j-1]+(mp[i][j]==l+'a'?1:0);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			int l=-1,r=min(n-i+1,m-j+1)+1,mid;
			while(l+1<r){
				mid=l+r>>1;
				if(ck(i+mid-1,j+mid-1,mid))l=mid;
				else r=mid; 
			}cout<<l<<' ';
		} 
		cout<<'\n';
	}		
}

上一题