社团游戏

社团游戏

https://ac.nowcoder.com/acm/contest/6874/H

用二维前缀和记录字母个数,对于每个点二分正方形的边长,并对于每个字母进行判断,详细的注释下见代码

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
int read()
{
   int s=0,bj=0;
   char ch=getchar();
   while(ch<'0'||ch>'9')bj|=(ch=='-'),ch=getchar();
   while(ch>='0'&&ch<='9')s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
   return bj?-s:s;
}
void printnum(int x)
{
    if(x>9)printnum(x/10);
    putchar(x%10^48);
}
void print(int x,char ch)
{
    if(x<0){putchar('-');x=-x;}
    printnum(x);putchar(ch);
}
int n,m,K;
char ch[505];
int sum[505][505][26];//二维前缀和,sum[i][j][k]表示以(i,j)为左下角的矩形中k的个数 
int Ask(int X1,int Y1,int X2,int Y2,int num)
{
    return sum[X2][Y2][num]-sum[X1-1][Y2][num]-sum[X2][Y1-1][num]+sum[X1-1][Y1-1][num];
}
int main()
{
    n=read();m=read();K=read();
    for(int i=1;i<=n;++i)
    {
        scanf("%s",ch+1);
        for(int j=1;j<=m;++j)++sum[i][j][ch[j]-'a']; 
    }
    for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)
    for(int k=0;k<26;++k)
    sum[i][j][k]=sum[i][j][k]+sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k];//计算前缀和
    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),mid;
            while(l<=r)//二分正方形大小 
            {
                mid=(l+r)>>1;int bj=0;
                for(int k=0;k<26;++k)if(Ask(i,j,i+mid-1,j+mid-1,k)>K){bj=1;break;}
//对于每一个字母判断是否合法 
                if(!bj)l=mid+1;
                else r=mid-1;
            }
            print(l-1,' ');
        }
        puts("");
    }
    return 0;
}
全部评论

相关推荐

就在我现在公司的隔壁每天经过都唏嘘不已(就是羡慕)什么时候可以到这里上班啊
柯基在debug:从大学毕业投简历到现在了,应届的时候我都面到终面了,现在工作四年了连简历初筛都过不了了
投递莉莉丝游戏等公司8个岗位 >
点赞 评论 收藏
分享
矫健的闭门羹烹饪师又熬夜了:本人双非本,在鹅厂测开实习,你这个简历上写的这两个项目的技术栈都差不多,能够让面试官去延伸去问的八股除了redis就再没啥了,建议项目这边可以再改改,然后专业技能那块的话,感觉linux和测试工具可以分开写,毕竟不是干一件事的,反正没实习的基础上面试就深挖项目和八股,好好卷吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务