HDU7509
现在单组要13秒 但5组只给了20秒 或者说可以优化?
#include<bits/extc++.h>
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
using namespace std;using namespace __gnu_pbds;
struct card{
int bel,id;
};
unsigned strhash(vector<string>x){
unsigned ret=0;
for(auto i:x){
for(auto j:i){
ret=ret*1131+j;
}
}
return ret;
}
gp_hash_table<unsigned,int>DICTATION,SCORE;
char huase[]={'H','D','C','S'},daxiao[]={'A','K','Q','J','T','9','8','7','6','5','4','3','2'};
string pai[100][100];
int T;
vector<string>table;
int fenshu[200];
int anpaidaxiaopaixudange(string x,string y){
char A=x[0],B=y[0];
return fenshu[A]>fenshu[B];
}
int tonghuashun(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
for(int i=1;i<x.size();i++){
if(x[0][1]!=x[i][1]){
return 0;
}
}
if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
return 1;
}
//现在 我们的花色相同
for(int i=1;i<x.size();i++){
if(fenshu[x[i-1][0]]-fenshu[x[i][0]]!=1){
return 0;
}
}
return 1;
}
int huangjiatonghuashun(vector<string>x){
if(!tonghuashun(x)){
return 0;
}
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
return x.back()[0]=='A';
}
int sitiao(vector<string>x){
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
if(j==4){
return 1;
}
}
return 0;
}
int zuidasitiao(vector<string>x){
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
if(j==4){
return i;
}
}
}
int hulu(vector<string>x){
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
vector<int>vec;
for(auto [i,j]:mp){
vec.push_back(j);
}
if(vec[0]==2&&vec.back()==3){
return 1;
}
reverse(vec.begin(),vec.end());
if(vec[0]==2&&vec.back()==3){
return 1;
}
return 0;
}
int zuidasanpai(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
return fenshu[x[0][0]];
}
int zuidahulu(vector<string>x){
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
if(j==3){
return fenshu[i];
}
}
}
int tonghua(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
for(int i=1;i<x.size();i++){
if(x[0][1]!=x[i][1]){
return 0;
}
}
return 1;
}
int zuidatonghua(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
return fenshu[x[0][0]];
}
int zuidashunzi(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
return -1;
}
//现在 我们的花色相同
return fenshu[x[0][0]];
}
int zuidasantiao(vector<string>x){
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
if(j==3){
return i;
}
}
}
int shunzi(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
return 1;
}
//现在 我们的花色相同
for(int i=1;i<x.size();i++){
if(fenshu[x[i-1][0]]-fenshu[x[i][0]]!=1){
return 0;
}
}
return 1;
}
int santiao(vector<string>x){
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
if(j==3){
return 1;
}
}
return 0;
}
int liangdui(vector<string>x){
vector<int>vec;
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
vec.push_back(j);
}
sort(vec.begin(),vec.end());
if(vec.size()<3){
return 0;
}
return vec[0]==1&&vec[1]==2&&vec[2]==2;
}
int zuidaliangdui(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
return fenshu[x[0][0]];
}
int zuidaduizi(vector<string>x){
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
if(j==2){
return fenshu[i];
}
}
}
int duizi(vector<string>x){
vector<int>vec;
map<int,int>mp;
for(auto i:x){
mp[i[0]]++;
}
for(auto [i,j]:mp){
vec.push_back(j);
}
sort(vec.begin(),vec.end());
if(vec.size()<4){
return 0;
}
return vec[0]==1&&vec[1]==2&&vec[2]==1&&vec[3]==2;
}
int Fenshu(vector<string>x){
if(SCORE.find(strhash(x))!=SCORE.end()){
return SCORE[strhash(x)];
}
if(huangjiatonghuashun(x)){
return SCORE[strhash(x)]=10;
}
if(tonghuashun(x)){
return SCORE[strhash(x)]=9;
}
if(sitiao(x)){
return SCORE[strhash(x)]=8;
}
if(hulu(x)){
return SCORE[strhash(x)]=7;
}
if(tonghua(x)){
return SCORE[strhash(x)]=6;
}
if(shunzi(x)){
return SCORE[strhash(x)]=5;
}
if(santiao(x)){
return SCORE[strhash(x)]=4;
}
if(liangdui(x)){
return SCORE[strhash(x)]=3;
}
if(duizi(x)){
return SCORE[strhash(x)]=2;
}
return SCORE[strhash(x)]=1;
}
vector<string>get(int x){
for(int i=0;i<2;i++){
table.push_back(pai[x][i]);
}
auto ret=table;
for(int i=0;i<2;i++){
table.pop_back();
}
return ret;
}
int score(int now,int num,vector<string>table,vector<string>Now){
if(num>5){
return -1919810;
}
if(num+7-now<5){
return -1919810;
}
if(now==6){
return Fenshu(Now);
}
int ret=score(now+1,num,table,Now);
Now.push_back(table[now]);
ret=max(ret,score(now+1,num+1,table,Now));
return ret;
}
int zuidatonghuashun(vector<string>x){
sort(x.begin(),x.end(),anpaidaxiaopaixudange);
for(int i=1;i<x.size();i++){
if(x[0][1]!=x[i][1]){
return 0;
}
}
if(x[0][0]=='A'&&x[1][0]=='2'&&x[2][0]=='3'&&x[3][0]=='4'&&x[4][0]=='5'){
return -114514;
}
return fenshu[x[0][0]];
}
int diction(vector<string>x){
if(DICTATION.find(strhash(x))!=DICTATION.end()){
return DICTATION[strhash(x)];
}
if(huangjiatonghuashun(x)){
return DICTATION[strhash(x)]=114514;
}
if(tonghuashun(x)){
return DICTATION[strhash(x)]=zuidatonghuashun(x);
}
if(sitiao(x)){
return DICTATION[strhash(x)]=zuidasitiao(x);
}
if(hulu(x)){
return DICTATION[strhash(x)]=zuidahulu(x);
}
if(tonghua(x)){
return DICTATION[strhash(x)]=zuidatonghua(x);
}
if(shunzi(x)){
return DICTATION[strhash(x)]=zuidashunzi(x);
}
if(santiao(x)){
return DICTATION[strhash(x)]=zuidasantiao(x);
}
if(liangdui(x)){
return DICTATION[strhash(x)]=zuidaliangdui(x);
}
if(duizi(x)){
return DICTATION[strhash(x)]=zuidaduizi(x);
}
return DICTATION[strhash(x)]=zuidasanpai(x);
}
int canbeat(int a,int b){
vector<string>em;
int A=score(0,0,get(a),em),B=score(0,0,get(b),em);
if(A!=B){
return A>B;
}
return diction(get(a))>diction(get(b));
}
void Flop(pair<int,int>x,pair<int,int>y){
auto [A,B]=x;
auto [C,D]=y;
swap(pai[A][B],pai[C][D]);
}
int main(){
fenshu['2']=1,fenshu['3']=2,fenshu['4']=3,fenshu['5']=4,fenshu['6']=5;
fenshu['7']=6,fenshu['8']=7,fenshu['9']=8,fenshu['T']=9;
fenshu['J']=10,fenshu['Q']=11,fenshu['K']=12,fenshu['A']=13;
cin>>T;
while(T--){
vector<string>last;
table.clear();
vector<pair<int,int>>all;
for(int i=0;i<3;i++){
cin>>pai[0][i],all.push_back({0,i});
}
for(int i=1;i<=4;i++){
for(int j=0;j<2;j++){
cin>>pai[i][j],all.push_back({i,j});
}
}
for(char i:daxiao){
for(char j:huase){
string This;
This.push_back(i),This.push_back(j);
int in=1;
for(int i=0;i<3;i++){
if(This==pai[0][i]){
in=0;
}
}
for(int i=1;i<=4;i++){
for(int j=0;j<2;j++){
if(This==pai[i][j]){
in=0;
}
}
}
if(in){
last.push_back(This);
}
}
}
int want;
cin>>want;
want++;
int mx=0;
int num[100][100]={};//要是交换这两张牌 我能赢几个人
for(int i=0;i<all.size();i++){
for(int j=0;j<all.size();j++){
auto [A,B]=all[i];
auto [C,D]=all[j];
if(pai[A][B]>pai[C][D]){
continue;
}
Flop(all[i],all[j]);
for(int k=0;k<3;k++){
table.push_back(pai[0][k]);
}
for(auto A:last){
for(auto B:last){
if(A!=B){
table.push_back(A),table.push_back(B);
for(int k=1;k<=4;k++){
if(k!=want){
num[i][j]+=canbeat(want,k);
}
}
table.pop_back(),table.pop_back();
}
}
}
for(int k=0;k<3;k++){
table.pop_back();
}
Flop(all[i],all[j]);
mx=max(mx,num[i][j]);
}
}
int out=0;
for(int i=0;i<all.size();i++){
if(num[i][i]==mx){
cout<<"None\n";
out=1;
break;
}
}
if(!out){
string ans;
for(int i=0;i<all.size();i++){
for(int j=0;j<all.size();j++){
auto [A,B]=all[i];
auto [C,D]=all[j];
if(pai[A][B]<=pai[C][D]&&mx==num[i][j]){
string now=pai[A][B]+" "+pai[C][D];
if(ans.empty()){
ans=now;
}
ans=min(ans,now);
}
}
}
cout<<ans<<'\n';
}
}
}