empty

2021hych / 2024-04-24 / 原文

#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,ans,cnt[35],bp[35],fact[5],p2[21],G[14]={0,1,9,10,18,19,27,28,29,30,31,32,33,34},dp[35][5][2][5][5],a[35]; string s;
void init() { fact[0]=fact[1]=1,fact[2]=2,fact[3]=6,fact[4]=24; p2[0]=1; for(int i=1;i<=20;i++) p2[i]=p2[i-1]*2; }
int C(int n,int m) { if(n<m) return 0; return fact[n]/fact[m]/fact[n-m]; }
int cost(int i,int j) { if(!bp[i]) return 1; return p2[j]; }
int check(int l,int r) { return ((1<=l&&r<=9)||(10<=l&&r<=18)||(19<=l&&r<=27)); }
int change(string s) {
	if(s[0]=='0') return 0;
	if(s.size()==2) { if(s[1]=='m') return s[0]-'0'; if(s[1]=='p') return s[0]+9-'0'; if(s[1]=='s') return s[0]+18-'0'; }
	else { if(s[0]=='E') return 28; if(s[0]=='S') return 29; if(s[0]=='W') return 30; if(s[0]=='N') return 31; if(s[0]=='Z') return 32; if(s[0]=='B') return 33; if(s[0]=='F') return 34; }
}
int sol1() {
	int ans=0,pd=0,m=1,tb=0;
	for(int i=1;i<=13;i++) { if(!cnt[G[i]]) return 0; pd|=(cnt[G[i]]>1); m*=cnt[G[i]]; tb+=bp[G[i]]; }if(!pd) return 0; for(int i=1;i<=13;i++) if(cnt[G[i]]>1) ans=max(ans,m/cnt[G[i]]*C(cnt[G[i]],2)*p2[tb+bp[G[i]]]);
	return ans*13;
}
int sol2() {
	int ans=0;
	for(int i=0;i<=33;i++) for(int j=0;j<=4;j++) for(int k=0;k<=1;k++) for(int l=0;l<=cnt[i];l++) for(int m=0;m<=cnt[i-1];m++) {
	if(!dp[i][j][k][l][m]) continue;
	if(cnt[i+1]>=3) dp[i+1][j+1][k][cnt[i+1]-3][l]=max(dp[i+1][j+1][k][cnt[i+1]-3][l],dp[i][j][k][l][m]*cost(i+1,3)*C(cnt[i+1],3));
	if(cnt[i+1]>0&&l>0&&m>0&&check(i-1,i+1)) 
	dp[i+1][j+1][k][cnt[i+1]-1][l-1]=max(dp[i+1][j+1][k][cnt[i+1]-1][l-1],dp[i][j][k][l][m]*cost(i-1,1)*cost(i,1)*cost(i+1,1)*cnt[i+1]*C(cnt[i-1],m-1)*C(cnt[i],l-1)/C(cnt[i-1],m)/C(cnt[i-1],l));
	if(cnt[i+1]>1&&l>1&&m>1&&check(i-1,i+1)) 
	dp[i+1][j+2][k][cnt[i+1]-2][l-2]=max(dp[i+1][j+1][k][cnt[i+1]-2][l-2],dp[i][j][k][l][m]*cost(i-1,2)*cost(i,2)*cost(i+1,2)*C(cnt[i+1],2)*C(cnt[i-1],m-2)*C(cnt[i],l-2)/C(cnt[i-1],m)/C(cnt[i-1],l));
	if(cnt[i+1]>1&&!k) dp[i+1][j][1][cnt[i+1]-2][l]=max(dp[i+1][j][1][cnt[i+1]-2][l],dp[i][j][k][l][m]*cost(i+1,2)*C(cnt[i+1],2));
	if(!k&&cnt[i+1]>2&&l>0&&m>0&&check(i-1,i+1)) 
	dp[i+1][j+1][1][cnt[i+1]-3][l-1]=max(dp[i+1][j+1][1][cnt[i+1]-3][l-1],dp[i][j][k][l][m]*cost(i-1,1)*cost(i,1)*cost(i+1,3)*C(cnt[i+1],3)*C(cnt[i-1],m-1)*C(cnt[i],l-1)/C(cnt[i-1],m)/C(cnt[i-1],l));
	if(!k&&cnt[i+1]==4&&l>1&&m>1&&check(i-1,i+1)) 
	dp[i+1][j+1][1][0][l-2]=max(dp[i+1][j+1][1][0][l-2],dp[i][j][k][l][m]*cost(i-1,2)*cost(i,2)*cost(i+1,4)*C(cnt[i-1],m-2)*C(cnt[i],l-2)/C(cnt[i-1],m)/C(cnt[i-1],l));
	if(cnt[i+1]==4&&l>0&&m>0&&check(i-1,i+1)) 
	dp[i+1][j+2][k][0][l-1]=max(dp[i+1][j+2][k][0][l-1],dp[i][j][k][l][m]*cost(i-1,1)*cost(i,1)*cost(i+1,4)*C(cnt[i-1],m-1)*C(cnt[i],l-1)/C(cnt[i-1],m)/C(cnt[i-1],l));
	dp[i+1][j][k][cnt[i+1]][l]=max(dp[i+1][j][k][cnt[i+1]][l],dp[i][j][k][l][m]);
	}
	for(int i=0;i<=34;i++) for(int j=0;j<=4;j++) for(int k=0;k<=4;k++) ans=max(ans,dp[i][4][1][j][k]);
	return ans;
}
int sol3() { int ans=1; for(int i=1;i<=34;i++) a[i]=C(cnt[i],2)*cost(i,2); sort(a+1,a+35,greater<int>()); for(int i=1;i<=7;i++) ans*=a[i]; return ans*7; }
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	init(); cin>>T;
	while(T--) {
		memset(dp,0,sizeof(dp)); dp[0][0][0][0][0]=1; ans=0; for(int i=1;i<=34;i++) cnt[i]=4,bp[i]=0;
		for(;;) { cin>>s; if(!change(s)) break; cnt[change(s)]--; } for(;;) { cin>>s; if(!change(s)) break; bp[change(s)]=1; } 
		//cout<<sol1()<<" "<<sol2()<<" "<<sol3()<<endl;
		//ans=max(max(sol1(),sol2()),sol3()); cout<<ans<<endl;
	}
	return 0;
}