#11. 轮舞

轮舞

Description

小W办了一个有关舞蹈的节目,并用NNEZ的公款作为奖金引来了许多位选手来参与。

对于任意两名选手,他们之间都有一名选手喜欢另一名选手。遗憾的是,这种喜欢总是单向的,也就是说如果选手ii喜欢选手jj,那么选手jj就不会喜欢选手ii

现在小W要举办TT期节目,第ii期节目有NiN_i名选手报名,每期节目中需要有 3 名选手参与。在每期节目的最后,这些选手要一起表演轮舞,来凸显友谊第一,比赛第二的精神。为了让选手打消顾虑,小W要求在选出的选手中,每名选手都至少喜欢另外一名选手。

小W想知道,对于每期节目,有多少种选择选手的方式满足他的要求。然而他是第一次做这种工作,没有经验,所以他把任务交给了你。两种方案不同当且仅当有一位选手在一个方案中出现而在另一个方案中没有出现。

Format

Input

第一行输入一个整数TT,表示小W要举办的期数。

接下来是TT组输入,每组输入对应一期节目。

每组输入的第一行输入一个整数NiN_i,表示这期节目中选手的数量。

接下来NiN_i行,每行输入一个长为NiN_i的字符串,其中第ii行的第jj个字符如果为YY,表示第ii位选手喜欢第jj位选手,否则如果为NN,则相反。保证第ii行第jj个字符和第jj行第ii个字符不同。第ii行的第ii个字符没有意义,你应该忽略

Output

输出TT行,每行输出一个整数,第ii行应该输出第ii期节目选择的方案数。

Samples

2
4
NYNY
NNYY
YNNN
NNYN
4
YYNY
NYYY
YNYN
NNYY
2
2

Limitation

【提示】

请注意多组数据带来的影响。每组数据处理完后,可能用到的计数器需要清零。

若你不会读入字符串并处理,可参考下方

#include <cstdio>
#include <iostream>
#include <algorithm>
const int N = 2000 + 5;
using namespace std;
char s[N][N];
int g[N][N];
int main()
{
     int T;
    scanf("%d", &T);
    while (T--)
    {
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%s", s[i] + 1);
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
            {
                if (s[i][j] == 'Y') g[i][j] = 1;
                else g[i][j] = 0;
            }

        /*
            此时已考虑了T组输入,将读入的字符串转为0 / 1数组。
           g[i][j] = 0 / 1表示i是否喜欢j
        */

        int ans = 0;
    }
    return 0;

}

【样例说明】

对于第一组数据:合法的选择方案有:{1,2,3},{1,3,4}\{1,2,3\},\{1,3,4\}

【数据范围】

对于前30%30\%的数据:T=1,3Ni200T=1,3\le N_i\le 200

对于前50%50\%的数据:1T10,3Ni2001\le T\le 10,3\le N_i\le 200

对于后50%50\%的数据:1T3,3Ni20001\le T\le 3,3\le N_i\le 2000