http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1974
// 时间复杂度不好      
/**/ /*
N  B  N  B  J  B
N  B  N  B  J  B
dp[0][N]=1; dp[1][N]=1; dp[2][N]=2;
*/

#include
< iostream >
using   namespace  std;
int  dp[ 251 ][ 5 ]; // 列号 // B J H Y N
int  map[ 251 ][ 251 ];
int  fun( char  ch)
{
    
switch(ch)
    
{
    
case 'B':return 0;
    
case 'J':return 1;
    
case 'H':return 2;
    
case 'Y':return 3;
    
case 'N':return 4;
    }

    
return 0;
}

int  main()
{
    
int t;
    cin
>>t;
    
while(t--)
    
{
        
int m,n,i,j,k,t;
        
char ch;
        
long long sum=0;
        cin
>>m>>n;
        
for(i=0;i<m;i++)
        
{
            
for(j=0;j<n;j++)
            
{
                cin
>>ch;
                map[i][j]
=fun(ch);
            }

        }

        
for(k=0;k<n;k++)
               
for(t=0;t<5;t++)
                  dp[k][t]
=0;
        
for(i=0;i<m-1;i++)//
        {
            
for(j=i+1;j<m;j++)//
            {
                
if(map[i][0]==map[j][0]) //第0列的 i行与j行的福娃一样
                    dp[0][map[j][0]]=1;
                
for(k=1;k<n;k++)//
                {
                    
for(t=0;t<5;t++)//获取前面一列的福娃数
                        dp[k][t]=dp[k-1][t];
                    
if(map[i][k]==map[j][k])
                    
{
                        
if(dp[k][map[i][k]]>0)//第一对出现的不能算数,因为只有一列不是矩形
                            sum += dp[k][map[i][k]];
                        dp[k][map[i][k]]
++;
                    }

                }

                
for(k=0;k<n;k++)
                    
for(t=0;t<5;t++)
                         dp[k][t]
=0;
            }

        }

        printf(
"%lld\n",sum);
    }

    
return 0;
}