样例三种分数均正确,code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
string s;
int cnt[40];
set<int>pai;
int gsws(){
int ws[14]={0,1,9,10,18,19,27,28,29,30,31,32,33,34},ret=-1e9;
for(int i=1;i<=13;i++){
int ans=13,flag=1;
for(int j=1;j<=13;j++){
if(j!=i){
if(cnt[ws[j]]>=1){
ans*=cnt[ws[j]];
}
else{
flag=0;
}
if(pai.count(ws[j])){
ans*=2;
}
}
else{
if(cnt[ws[j]]>=2){
ans*=(cnt[ws[j]]*(cnt[ws[j]]-1)/2);
}
else{
flag=0;
}
if(pai.count(ws[j])){
ans*=4;
}
}
}
if(flag){
ret=max(ret,ans);
}
}
return ret;
}
int C(int a,int b){
if(a<b){
return 0;
}
if(b==0){
return 1;
}
int up=1,down=1;
for(int i=1;i<=b;i++){
up*=(a-i+1);
down*=i;
}
return up/down;
}
int qpow(int base,int up){
int ret=1;
while(up){
if(up&1){
ret*=base;
}
base*=base;
up>>=1;
}
return ret;
}
int com(){
int f[40][10][2][10][10],ans=-1e9;
memset(f,0,sizeof f);
f[0][0][0][0][0]=1;
for(int i=0;i<=8;i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=1;k++){
for(int c1=0;c1<=4;c1++){
for(int c2=0;c2<=4;c2++){
if(f[i][j][k][c1][c2]!=0){
if(j==4&&k==1){
ans=max(ans,f[i][j][k][c1][c2]);
}
if(j<=3&&cnt[i+1]>=3){
f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
}
for(int t=1;t<=2;t++){
if(j+t<=4&&i>=2&&cnt[i+1]>=t&&c1<=cnt[i]-t&&c2<=cnt[i-1]-t){
f[i+1][j+t][k][t][c1+t]=max(f[i+1][j+t][k][t][c1+t],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],t)*C(cnt[i],c1+t)*C(cnt[i-1],c2+t)*(pai.count(i+1)?qpow(2,t):1)*(pai.count(i)?qpow(2,t):1)*(pai.count(i-1)?qpow(2,t):1));
}
}
if(j<=2&&i>=2&&cnt[i+1]==4&&c1<cnt[i]&&c2<cnt[i-1]){
f[i+1][j+2][k][4][c1+1]=max(f[i+1][j+2][k][4][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?16:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
}
if(cnt[i+1]>=2&&k==0){
f[i+1][j][1][2][c1]=max(f[i+1][j][1][2][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
}
if(j<=3&&i>=2&&cnt[i+1]>=3&&k==0&&c1<cnt[i]&&c2<cnt[i-1]){
f[i+1][j+1][1][3][c1+1]=max(f[i+1][j+1][1][3][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],3)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?8:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
if(j<=2&&i>=2&&cnt[i+1]==4&&k==0&&c1<cnt[i]-1&&c2<cnt[i-1]-1){
f[i+1][j+2][1][4][c1+2]=max(f[i+1][j+2][1][4][c1+2],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+2)*C(cnt[i-1],c2+2)*(pai.count(i+1)?16:1)*(pai.count(i)?4:1)*(pai.count(i-1)?4:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
}
}
}
}
}
}
for(int i=9;i<=10;i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=1;k++){
for(int c1=0;c1<=4;c1++){
for(int c2=0;c2<=4;c2++){
if(f[i][j][k][c1][c2]!=0){
if(j==4&&k==1){
ans=max(ans,f[i][j][k][c1][c2]);
}
if(j<=3&&cnt[i+1]>=3){
f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
}
if(cnt[i+1]>=2&&k==0){
f[i+1][j][1][2][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
}
}
}
}
}
}
for(int i=11;i<=17;i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=1;k++){
for(int c1=0;c1<=4;c1++){
for(int c2=0;c2<=4;c2++){
if(f[i][j][k][c1][c2]!=0){
if(j==4&&k==1){
ans=max(ans,f[i][j][k][c1][c2]);
}
if(j<=3&&cnt[i+1]>=3){
f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
}
for(int t=1;t<=2;t++){
if(j+t<=4&&i>=2&&cnt[i+1]>=t&&c1<=cnt[i]-t&&c2<=cnt[i-1]-t){
f[i+1][j+t][k][t][c1+t]=max(f[i+1][j+t][k][t][c1+t],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],t)*C(cnt[i],c1+t)*C(cnt[i-1],c2+t)*(pai.count(i+1)?qpow(2,t):1)*(pai.count(i)?qpow(2,t):1)*(pai.count(i-1)?qpow(2,t):1));
}
}
if(j<=2&&i>=2&&cnt[i+1]==4&&c1<cnt[i]&&c2<cnt[i-1]){
f[i+1][j+2][k][4][c1+1]=max(f[i+1][j+2][k][4][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?16:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
}
if(cnt[i+1]>=2&&k==0){
f[i+1][j][1][2][c1]=max(f[i+1][j][1][2][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
}
if(j<=3&&i>=2&&cnt[i+1]>=3&&k==0&&c1<cnt[i]&&c2<cnt[i-1]){
f[i+1][j+1][1][3][c1+1]=max(f[i+1][j+1][1][3][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],3)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?8:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
if(j<=2&&i>=2&&cnt[i+1]==4&&k==0&&c1<cnt[i]-1&&c2<cnt[i-1]-1){
f[i+1][j+2][1][4][c1+2]=max(f[i+1][j+2][1][4][c1+2],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+2)*C(cnt[i-1],c2+2)*(pai.count(i+1)?16:1)*(pai.count(i)?4:1)*(pai.count(i-1)?4:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
}
}
}
}
}
}
for(int i=18;i<=19;i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=1;k++){
for(int c1=0;c1<=4;c1++){
for(int c2=0;c2<=4;c2++){
if(f[i][j][k][c1][c2]!=0){
if(j==4&&k==1){
ans=max(ans,f[i][j][k][c1][c2]);
}
if(j<=3&&cnt[i+1]>=3){
f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
}
if(cnt[i+1]>=2&&k==0){
f[i+1][j][1][2][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
}
}
}
}
}
}
for(int i=20;i<=26;i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=1;k++){
for(int c1=0;c1<=4;c1++){
for(int c2=0;c2<=4;c2++){
if(f[i][j][k][c1][c2]!=0){
if(j==4&&k==1){
ans=max(ans,f[i][j][k][c1][c2]);
}
if(j<=3&&cnt[i+1]>=3){
f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
}
for(int t=1;t<=2;t++){
if(j+t<=4&&i>=2&&cnt[i+1]>=t&&c1<=cnt[i]-t&&c2<=cnt[i-1]-t){
f[i+1][j+t][k][t][c1+t]=max(f[i+1][j+t][k][t][c1+t],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],t)*C(cnt[i],c1+t)*C(cnt[i-1],c2+t)*(pai.count(i+1)?qpow(2,t):1)*(pai.count(i)?qpow(2,t):1)*(pai.count(i-1)?qpow(2,t):1));
}
}
if(j<=2&&i>=2&&cnt[i+1]==4&&c1<cnt[i]&&c2<cnt[i-1]){
f[i+1][j+2][k][4][c1+1]=max(f[i+1][j+2][k][4][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?16:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
}
if(cnt[i+1]>=2&&k==0){
f[i+1][j][1][2][c1]=max(f[i+1][j][1][2][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
}
if(j<=3&&i>=2&&cnt[i+1]>=3&&k==0&&c1<cnt[i]&&c2<cnt[i-1]){
f[i+1][j+1][1][3][c1+1]=max(f[i+1][j+1][1][3][c1+1],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],3)*C(cnt[i],c1+1)*C(cnt[i-1],c2+1)*(pai.count(i+1)?8:1)*(pai.count(i)?2:1)*(pai.count(i-1)?2:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
if(j<=2&&i>=2&&cnt[i+1]==4&&k==0&&c1<cnt[i]-1&&c2<cnt[i-1]-1){
f[i+1][j+2][1][4][c1+2]=max(f[i+1][j+2][1][4][c1+2],f[i][j][k][c1][c2]/(C(cnt[i],c1)*C(cnt[i-1],c2))*C(cnt[i+1],4)*C(cnt[i],c1+2)*C(cnt[i-1],c2+2)*(pai.count(i+1)?16:1)*(pai.count(i)?4:1)*(pai.count(i-1)?4:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
}
}
}
}
}
}
for(int i=27;i<=33;i++){
for(int j=0;j<=4;j++){
for(int k=0;k<=1;k++){
for(int c1=0;c1<=4;c1++){
for(int c2=0;c2<=4;c2++){
if(f[i][j][k][c1][c2]!=0){
if(j==4&&k==1){
ans=max(ans,f[i][j][k][c1][c2]);
}
if(j<=3&&cnt[i+1]>=3){
f[i+1][j+1][k][3][c1]=max(f[i+1][j+1][k][3][c1],f[i][j][k][c1][c2]*C(cnt[i+1],3)*(pai.count(i+1)?8:1));
}
if(cnt[i+1]>=2&&k==0){
f[i+1][j][1][2][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]*C(cnt[i+1],2)*(pai.count(i+1)?4:1));
}
f[i+1][j][k][0][c1]=max(f[i+1][j][k][0][c1],f[i][j][k][c1][c2]);
}
}
}
}
}
}
for(int i=0;i<=4;i++){
for(int j=0;j<=4;j++){
ans=max(ans,f[34][4][1][i][j]);
}
}
return ans;
}
int qdz(){
int f[40][40],ans=-1e9;
memset(f,0,sizeof f);
f[0][0]=7;
for(int i=0;i<=33;i++){
for(int j=0;j<=7;j++){
if(f[i][j]!=0){
if(j==7){
ans=max(ans,f[i][j]);
}
if(cnt[i+1]>=2&&j<=6){
f[i+1][j+1]=max(f[i+1][j+1],f[i][j]*(cnt[i+1]*(cnt[i+1]-1)/2)*(pai.count(i+1)?4:1));
}
f[i+1][j]=max(f[i+1][j],f[i][j]);
}
}
}
ans=max(ans,f[34][7]);
return ans;
}
signed main(){
cin>>t;
while(t--){
for(int i=1;i<=34;i++){
cnt[i]=4;
}
pai.clear();
while(cin>>s){
if(s=="0"){
break;
}
else{
if(s.size()==2){
if(s[1]=='m'){
cnt[s[0]-'0']--;
}
if(s[1]=='p'){
cnt[s[0]-'0'+9]--;
}
if(s[1]=='s'){
cnt[s[0]-'0'+18]--;
}
}
else{
if(s=="E"){
cnt[28]--;
}
if(s=="S"){
cnt[29]--;
}
if(s=="W"){
cnt[30]--;
}
if(s=="N"){
cnt[31]--;
}
if(s=="Z"){
cnt[32]--;
}
if(s=="B"){
cnt[33]--;
}
if(s=="F"){
cnt[34]--;
}
}
}
}
while(cin>>s){
if(s=="0"){
break;
}
else{
if(s.size()==2){
if(s[1]=='m'){
pai.emplace(s[0]-'0');
}
if(s[1]=='p'){
pai.emplace(s[0]-'0'+9);
}
if(s[1]=='s'){
pai.emplace(s[0]-'0'+18);
}
}
else{
if(s=="E"){
pai.emplace(28);
}
if(s=="S"){
pai.emplace(29);
}
if(s=="W"){
pai.emplace(30);
}
if(s=="N"){
pai.emplace(31);
}
if(s=="Z"){
pai.emplace(32);
}
if(s=="B"){
pai.emplace(33);
}
if(s=="F"){
pai.emplace(34);
}
}
}
}
int sc1=gsws(),sc2=com(),sc3=qdz();
cout<<max(sc1,max(sc2,sc3))<<endl;
}
return 0;
}