結果

問題 No.2168 双頭ヒドラゲーム
ユーザー hotman78hotman78
提出日時 2022-12-20 18:15:52
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,810 bytes
コンパイル時間 3,247 ms
コンパイル使用メモリ 232,828 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-04-29 02:53:16
合計ジャッジ時間 3,426 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 1 ms
5,376 KB
testcase_02 AC 1 ms
5,376 KB
testcase_03 AC 1 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 WA -
testcase_09 AC 2 ms
5,376 KB
testcase_10 WA -
testcase_11 WA -
testcase_12 AC 2 ms
5,376 KB
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 AC 2 ms
5,376 KB
testcase_19 AC 2 ms
5,376 KB
testcase_20 AC 3 ms
5,376 KB
testcase_21 AC 2 ms
5,376 KB
testcase_22 AC 2 ms
5,376 KB
testcase_23 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define all(n) (n).begin(),(n).end()

// カントールの標準形に直す
struct tree{
    vector<tree>v;
    tree(){
    }
    tree operator+(const tree& b)const{
        tree res;
        for(auto c:v){
            if(!b.v.empty()&&c<b.v[0])break;
            res.v.emplace_back(c);
        }
        for(auto c:b.v){
            res.v.emplace_back(c);
        }
        sort(res.v.begin(),res.v.end());
        reverse(res.v.begin(),res.v.end());
        return res;
    }
    // tree mul_omega()const{
    //     if(v.size()==0){
    //         return tree();
    //     }
    //     tree res=*this;
    //     tree one;
    //     one.v.emplace_back(tree());
    //     reverse(res.v.begin(),res.v.end());
    //     while(res.v.size()>=2&&res.v[res.v.size()-2]==res.v[res.v.size()-1]){
    //         res.v.erase(res.v.end()-2);
    //     }
    //     reverse(res.v.begin(),res.v.end());
    //     res.v[0]=move(res.v[0])+one;
    //     return res;
    // }
    tree exp(){
        tree res=tree();
        res.v.emplace_back(*this);
        return res;
    }
    // omega^a を左からかける
    tree mul_omega(const tree& a)const{
        tree res=*this;
        for(auto& c:res.v){
            c=a+move(c);
        }
        return res;
    }
    void print(string s=""){
        for(auto e:v){
            cerr<<s+"-"<<endl;
            e.print(s+"    ");
        }
    }
    bool operator==(const tree&b)const{
        return v==b.v;
    }
    bool operator<(const tree&b)const{
        return v<b.v;
    }
};

// (a|b) = 適当...

tree string_to_tree(string s,bool b=0){
    if(s=="")return tree();
    assert(s[0]=='(');
    int idx=1,idx2=1,val=0;
    tree ch[2]={};
    bool right=0;
    while(1){
        if(val==0&&s[idx2]=='|'){
            right=1;
            idx=idx2+1;
            idx2=idx;
            continue;
        }
        if(s[idx2]=='(')val++;
        if(val==0&&s[idx2]==')'){
            break;
        }
        if(s[idx2]==')')val--;
        if(val==0){
            if(right==0){
                ch[right]=string_to_tree(s.substr(idx,idx2-idx+1),1).exp()+move(ch[right]);
            }else{
                ch[right]=string_to_tree(s.substr(idx,idx2-idx+1),1)+move(ch[right]);
            }
            idx=idx2+1;
        }
        idx2++;
    }
    if(b==0){
        return ch[1];
    }else{
        auto one=tree().exp();
        auto res=(one+ch[1].mul_omega(one)).mul_omega(ch[0].exp().exp().exp().exp().exp().exp());
        return res;
    }
}
int main(){
    string s;
    string t;
    cin>>s>>t;
    s="(|"+s+")";
    t="(|"+t+")";
    auto ts=string_to_tree(s);
    auto tt=string_to_tree(t);
    // ts.print();
    // tt.print();
    cout<<(tt<ts?0:1)<<endl;
}
0