题意:
        

方法一:
直接模拟


思路:

    遍历字符串,将其分割为两个字符串数组,
    并按下图所示规则比较两个字符串数组:

        

#include <bits/stdc++.h>

using namespace std;

unordered_map<string,int> mp;
vector<string> a;
vector<string> b;

//0表示无法比较,1表示左边大于右边,-1表示右边大于左边
int cmp(){
   
    int n1=a.size();
    int n2=b.size();
    
    if(n1==1){//左边牌数是1
        if(n2==1){//右边字符串长度为1,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }else if(n1==2){//左边牌数是2
        if(a[0]=="joker"||a[0]=="JOKER")
            return 1;
        if(n2==2){//右边字符串长度为2,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }else if(n1==3){//左边牌数是3
        if(n2==3){//右边字符串长度为3,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }else if(n1==4){//左边牌数是4
        if(n2==4){//右边字符串长度为4,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }
        return 1;
    }else if(n1==5){//左边牌数是5
        if(n2==5){//右边字符串长度为5,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }
    return 0;
}

int main(){
    
    //初始化
    
    for(int i=3;i<=10;i++)
        mp[to_string(i)]=i;
    mp["J"]=11;
    mp["Q"]=12;
    mp["K"]=13;
    mp["A"]=14;
    mp["2"]=15;
    mp["joker"]=16;
    mp["JOKER"]=17;
    
    string s;
    while(getline(cin,s)){//输入
        a.clear();
        b.clear();
        s+=" ";
        int len=s.size();
        string x="";
        int flag=0;
        for(int i=0;i<len;i++){//遍历字符串,得到分割的单词
            if(s[i]==' '||s[i]=='-'){
                if(flag==0)
                    a.push_back(x);
                else
                    b.push_back(x);
                x="";
                if(s[i]=='-')
                    flag=1;
            }else{
                x+=s[i];
            }
        }
        int t=cmp();//比较
        if(t==0){//无法比较
            cout << "ERROR\n";
        }else if(t>0){//左边大
            for(int i=0;i<a.size();i++)
                cout << a[i] << " ";
            cout << endl;
        }else{//右边大
            for(int i=0;i<b.size();i++)
                cout << b[i] << " ";
            cout << endl;
        }
    }
    return 0;
}


时间复杂度:
空间复杂度:

方法二:
优化

思路:
        左右边字符串数组比较规则:(比较顺序)
         1.比较左右边字符串是否为对王;
         2.左右边字符串都为4的情况;
         3.左右边字符串都为1的情况;
         4.左右边字符串都为2的情况;
         5.左右边字符串都为3的情况;
         6.左右边字符串都为5的情况。
        (其中顺序3、4、5、6可以随意对调)。
        


#include <bits/stdc++.h>

using namespace std;

unordered_map<string,int> mp;
vector<string> a;
vector<string> b;

//0表示无法比较,1表示左边大于右边,-1表示右边大于左边
int cmp(){
   
    int n1=a.size();
    int n2=b.size();
    if(n1==2&&(a[0]=="joker"||a[0]=="JOKER"))//左边字符串是对王
        return 1;
    if(n2==2&&(b[0]=="joker"||b[0]=="JOKER"))//右边字符串是对王
        return -1;
    if(n1==4&&n2==4){//左右边字符串都为4
        return mp[a[0]]>mp[b[0]]?1:-1;
    }else if(n1==4)//左边字符串都为4
        return 1;
    else if(n2==4)//右边字符串都为4
        return -1;
    if(n1==5&&n2==5)//左右边字符串都为5
        return mp[a[0]]>mp[b[0]]?1:-1;
    if(n1==3&&n2==3)//左右边字符串都为3
        return mp[a[0]]>mp[b[0]]?1:-1;
    if(n1==2&&n2==2)//左右边字符串都为2
        return mp[a[0]]>mp[b[0]]?1:-1;
    if(n1==1&&n2==1)//左右边字符串都为1
        return mp[a[0]]>mp[b[0]]?1:-1;
    return 0;
}

int main(){
    
    //初始化
    
    for(int i=3;i<=10;i++)
        mp[to_string(i)]=i;
    mp["J"]=11;
    mp["Q"]=12;
    mp["K"]=13;
    mp["A"]=14;
    mp["2"]=15;
    mp["joker"]=16;
    mp["JOKER"]=17;
    
    string s;
    while(getline(cin,s)){//输入
        a.clear();
        b.clear();
        s+=" ";
        int len=s.size();
        string x="";
        int flag=0;
        for(int i=0;i<len;i++){//遍历字符串,得到分割的单词
            if(s[i]==' '||s[i]=='-'){
                if(flag==0)
                    a.push_back(x);
                else
                    b.push_back(x);
                x="";
                if(s[i]=='-')
                    flag=1;
            }else{
                x+=s[i];
            }
        }
        int t=cmp();//比较
        if(t==0){//无法比较
            cout << "ERROR\n";
        }else if(t>0){//左边大
            for(int i=0;i<a.size();i++)
                cout << a[i] << " ";
            cout << endl;
        }else{//右边大
            for(int i=0;i<b.size();i++)
                cout << b[i] << " ";
            cout << endl;
        }
    }
    return 0;
}

时间复杂度:
空间复杂度: