枚举 i 列和 j 列,统计(第 k 行 i 列) 和 (第 k 行 j 列) 相等的数目,再用组合公式算出符合的矩形的个数
#include<cstdio>
#include<cstring>
int fun(char c)
{
if(c=='B') return 0;
if(c=='J') return 1;
if(c=='H') return 2;
if(c=='Y') return 3;
return 4;
}
int main()
{
#ifdef TEST
freopen("in.in","r",stdin);
#endif
int t,n,m;
char s[260][260];
int num[5];
scanf("%d",&t);
while(t--)
{
int ans=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",s[i]);
/*for(int i=0;i<n-1;i++)//暴力超时
{
for(int j=0;j<m-1;j++)
{
for(int k=j+1;k<m;k++)
{
if(s[i][j]!=s[i][k]) continue;
for(int l=i+1;l<n;l++)
{
if(s[i][j]==s[l][j] && s[i][j]==s[l][k])
ans++;
}
}
}
}*/
for(int i=0;i<m-1;i++)
{
for(int j=i+1;j<m;j++)
{
memset(num,0,sizeof(num));
for(int k=0;k<n;k++)
{
if(s[k][i]==s[k][j]) num[fun(s[k][i])]++;
}
for(int l=0;l<5;l++)
{
ans+=num[l]*(num[l]-1)/2;
}
}
}
printf("%d\n",ans);
}
}