题意 给出一个矩形 问在其中存在多少子矩形 其四个角上的字母是一样的
一开始暴力写了一发 先枚举行数 再枚举两个列数 再向下枚举行数 判断能否 没有意外的超时了
后来想了想 当我们已经确定两个列数的时候 向下寻找的时候 如果找到了tot条边与第一条边同字母 这些边可以组成(tot-1)*tot个矩形 使满足题意
为了避免重复寻找 需要一个map来记录 由于矩形的边最长100 我们存已经检索的字母*1000*1000+左列数*1000+右列数
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<string> #include<map> using namespace std; int n,m; char a[300][300]; int main(){ int t; scanf("%d",&t); while(t--) { map<int ,int >q; q.clear(); int sum=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%s",a[i]+1); for(int i=1;i<=n-1;i++) { for(int k=1;k<=m-1;k++) { for(int j=k+1;j<=m;j++) { if(a[i][k]!=a[i][j]) continue; int x=a[i][k]-‘A‘; if(q[x*1000000+k*1000+j]!=0) continue; int tot=1; for(int l=i+1;l<=n;l++) { if(a[l][j]==a[l][k]&&a[l][j]==a[i][j]) { tot++; q[x*1000000+k*1000+j]=1; } } sum+=(tot-1)*tot/2; } } } printf("%d\n",sum); } }
时间: 2024-10-14 00:19:08