我完全不行
查看原帖
我完全不行
98618
Provicy楼主2020/12/28 18:47
#include <bits/stdc++.h>
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
#define E (n+m)
using namespace std;
inline int read()
{
    int s=0, w=1; ri char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
    return s*w;
}
int a[38],book[38],Ans,C[38][38];
string inp;
map<string,int> Q;
inline void String_Init()
{
	for(ri int i=1;i<=9;i++)
	{
		string tt;
		char cc=(char)(i+'0');
		tt+=cc;
		tt+='m';
		Q[tt]=i;
	}
	for(ri int i=1;i<=9;i++)
	{
		string tt;
		char cc=(char)(i+'0');
		tt+=cc;
		tt+='p';
		Q[tt]=i+9;
	}
	for(ri int i=1;i<=9;i++)
	{
		string tt;
		char cc=(char)(i+'0');
		tt+=cc;
		tt+='s';
		Q[tt]=i+18;
	}
	Q["E"]=28, Q["S"]=29, Q["W"]=30, Q["N"]=31, Q["Z"]=32, Q["B"]=33, Q["F"]=34;
}
inline void Comb_Init()
{
	C[0][0]=1;
	for(ri int i=1;i<=35;i++)
	{
		C[i][0]=1;
		for(ri int j=1;j<=i;j++) C[i][j]=C[i-1][j]+C[i-1][j-1];
	}
}
inline int GSWS()
{
	int ret=0;
	if(book[1]&&book[9]&&book[10]&&book[18]&&book[19]&&book[27]&&book[28]
	&&book[29]&&book[30]&&book[31]&&book[32]&&book[33]&&book[34])
	{
		int gv=0;
		int arr[15];
		arr[1]=1, arr[2]=9, arr[3]=10, arr[4]=18, arr[5]=19, arr[6]=27;
		for(ri int i=7;i<=13;i++) arr[i]=i+21;
		for(ri int i=1;i<=13;i++)
		{
			gv=C[a[arr[i]]][2]*book[arr[i]]*book[arr[i]];
			for(ri int j=1;j<=13;j++)
			{
				if(i==j) continue;
				gv*=a[arr[j]]*book[arr[j]];
			}
			ret=max(ret,gv);
		}
	}
	return ret*13;
}
inline int SevenDZ()
{
	int ret=1;
	int arr[36];
	memset(arr,0,sizeof(arr));
	for(ri int i=1;i<=34;i++)
	{
		arr[i]=C[a[i]][2]*book[i]*book[i];
	}
	sort(arr+1,arr+1+34,greater<int>());
	for(ri int i=1;i<=7;i++) ret*=arr[i];
	return ret*7;
}
int F[34][5][2][5][5][5];
inline void gmax(int &x,int y)
{
	x=(x>y)?x:y;
}
inline bool Same(int x,int y,int z)
{
	if(x>=1&&x<=9&&y>=1&&y<=9&&z>=1&&z<=9) return 1;
	if(x>=10&&x<=18&&y>=10&&y<=18&&z>=10&&z<=18) return 1;
	if(x>=19&&x<=27&&y>=19&&y<=27&&z>=19&&z<=27) return 1;
	return 0;
}
inline int DP()
{
	//for(ri int i=1;i<=34;i++) printf("%lld : %lld %lld\n",i,a[i],book[i]);
	memset(F,0,sizeof(F)), F[1][0][0][0][0][0]=1;
	for(ri int i=1;i<=32;i++)
	{
		for(ri int j=0;j<=4;j++)
		for(ri int k=0;k<=1;k++)
		{
			for(ri int x=0;x<=a[i];x++)
			for(ri int y=0;y<=a[i+1];y++)
			for(ri int z=0;z<=a[i+2];z++)
			{
				if(j)
				{
					if(x&&y&&z&&Same(i,i+1,i+2))
					gmax(F[i][j][k][x][y][z],F[i][j-1][k][x-1][y-1][z-1]*book[i]*book[i+1]*book[i+2]*(a[i]-x+1)*(a[i+1]-y+1)*(a[i+2]-z+1));
					if(x>2)
					gmax(F[i][j][k][x][y][z],F[i][j-1][k][x-3][y][z]*book[i]*book[i]*book[i]*C[a[i]-x+3][3]);
					if(y>2)
					gmax(F[i][j][k][x][y][z],F[i][j-1][k][x][y-3][z]*book[i+1]*book[i+1]*book[i+1]*C[a[i+1]-y+3][3]);
					if(z>2)
					gmax(F[i][j][k][x][y][z],F[i][j-1][k][x][y][z-3]*book[i+2]*book[i+2]*book[i+2]*C[a[i+2]-z+3][3]);
				}
				if(k)
				{
					if(x>1) gmax(F[i][j][k][x][y][z],F[i][j][k-1][x-2][y][z]*book[i]*book[i]*C[a[i]-x+2][2]);
					if(y>1) gmax(F[i][j][k][x][y][z],F[i][j][k-1][x][y-2][z]*book[i+1]*book[i+1]*C[a[i+1]-y+2][2]);
					if(z>1) gmax(F[i][j][k][x][y][z],F[i][j][k-1][x][y][z-2]*book[i+2]*book[i+2]*C[a[i+2]-z+2][2]);
				}
			}
		}
		for(ri int j=0;j<=4;j++)
		for(ri int k=0;k<=1;k++)
		for(ri int y=0;y<=a[i+1];y++)
		for(ri int z=0;z<=a[i+2];z++)
		{
			int mx=0;
			for(ri int x=0;x<=a[i];x++)
			mx=max(mx,F[i][j][k][x][y][z]);
			F[i+1][j][k][y][z][0]=mx;
		}
	}
	int ret=0;
	for(ri int x=0;x<=a[32];x++)
	for(ri int y=0;y<=a[33];y++)
	for(ri int z=0;z<=a[34];z++)
	ret=max(ret,F[32][4][1][x][y][z]);
	/*for(ri int i=1;i<=32;i++)
	for(ri int j=0;j<=4;j++)
	for(ri int k=0;k<=1;k++)
	for(ri int x=0;x<=a[i];x++)
	for(ri int y=0;y<=a[i+1];y++)
	for(ri int z=0;z<=a[i+2];z++)
	printf("F[%lld][%lld][%lld][%lld][%lld][%lld] = %lld\n",i,j,k,x,y,z,F[i][j][k][x][y][z]);*/
	return ret;
}
signed main()
{
	freopen("test.in","r",stdin);
	freopen("test1.out","w",stdout);
	String_Init();
	Comb_Init();
	for(ri int T=read();T;T--)
	{
		for(ri int i=1;i<=34;i++) a[i]=4, book[i]=1;
		while(1)
		{
			cin>>inp;
			if(inp=="0") break;
			a[Q[inp]]--;
		}
		while(1)
		{
			cin>>inp;
			if(inp=="0") break;
			book[Q[inp]]=2;
		}
		Ans=max(GSWS(),SevenDZ());
		Ans=max(Ans,DP());
		printf("%lld\n",Ans);
	}
	return 0;
}
/*
7m 4p 2s 7s 6p 8s 7p 5s 9s 9s 1p 5m 9m 5s 4p 5s E 1p 6s 5p B 4m 6m W 6p 6s E 9s 5p 2s 8s 8p 4m 3s 9m 5p 3s 2s 6s 8s 8p 6p 5m 4s 3m 4s 5s 4s 6m 9s 6p N 5m 7s 4m 2m 2s 6s 3m 7p B B N 1m 3m B 8p F 7p 0
W 4p N 3m 2m B 9m 3p 1p 6p S 4s 5p 8s 4m 5s 2s 3s 0
*/

直接过不了样例/cy

2020/12/28 18:47
加载中...