Submission #31416520


Source Code Expand

#include <atcoder/string>

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
using i32 = int32_t;
using u32 = uint32_t;
using i64 = int64_t;
using u64 = uint64_t;
#define rep(i,n) for(int i=0; i<(int)(n); i++)


void sort_tg_by(vector<vector<int>>& tg, vector<int>& by, int bound){
    int sz = 0;
    for(auto a : tg ) sz += a.size();
    vector<vector<pair<int,int>>> bucket(bound);
    rep(i,tg.size()) for(int v : tg[i]) bucket[by[v]].push_back(make_pair(i,v));
    for(auto& a : tg) a.clear();
    for(auto& b : bucket) for(auto [i,v] : b) tg[i].push_back(v);
}


vector<int> coord_compress_from_arr_by(vector<vector<int>>& tg, vector<int>& by, int bound){
    int n = tg.size();
    vector<int> sa_src;
    vector<int> sa_recover;
    rep(i,n){
        sa_recover.push_back(i);
        for(auto a : tg[i]){
            sa_src.push_back(by[a] + 1);
            sa_recover.push_back(-1);
        }
        sa_src.push_back(0);
    }
    auto sa = atcoder::suffix_array(sa_src, bound);

    vector<int> sorted_tg_idx;
    rep(i,sa.size()) if(sa_recover[sa[i]] != -1) sorted_tg_idx.push_back(sa_recover[sa[i]]);
    
    vector<int> res(n);
    for(int i=1; i<n; i++){
        res[sorted_tg_idx[i]] = res[sorted_tg_idx[i-1]];
        bool same = true;
        if(tg[sorted_tg_idx[i-1]].size() != tg[sorted_tg_idx[i]].size()){
            same = false;
        }
        else{
            rep(j,tg[sorted_tg_idx[i]].size()){
                if(by[tg[sorted_tg_idx[i-1]][j]] != by[tg[sorted_tg_idx[i]][j]]) same = false;
            }
        }
        if(!same) res[sorted_tg_idx[i]]++;
    }
    return res;
}


int main(){
    int N; cin >> N;
    vector<vector<int>> E(N);
    rep(i,N-1){
        int u,v; cin >> u >> v; u--; v--;
        E[u].push_back(v);
        E[v].push_back(u);
    }

    vector<int> parent(N, -1);
    vector<int> depth(N, -1);
    vector<int> bfs = {0};
    depth[0] = 0;
    rep(i,N){
        int p = bfs[i];
        for(int e : E[p]) if(depth[e] == -1){
            depth[e] = depth[p] + 1;
            parent[e] = p;
            bfs.push_back(e);
        }
    }

    int max_depth = *max_element(depth.begin(), depth.end());
    vector<vector<int>> from_depth(max_depth+2);
    rep(i,N) from_depth[depth[i]].push_back(i);

    vector<int> compressed(N, 0);
    vector<vector<int>> children_ordered(N);
    vector<vector<int>> Arr(N);

    rep(p,N) for(int c : E[p]) if(depth[p] < depth[c]) children_ordered[p].push_back(c);

    for(int d = max_depth; d >= 0; d--){
        auto& vtxs = from_depth[d];
        vector<vector<int>> children_ordered_part(vtxs.size());
        rep(i,vtxs.size()) children_ordered_part[i] = move(children_ordered[vtxs[i]]);
        sort_tg_by(children_ordered_part, compressed, from_depth[d+1].size());
        auto compressed_part = coord_compress_from_arr_by(children_ordered_part, compressed, from_depth[d+1].size());
        rep(i,vtxs.size()) children_ordered[vtxs[i]] = move(children_ordered_part[i]);
        rep(i,vtxs.size()) compressed[vtxs[i]] = compressed_part[i];
    }

    vector<int> ans;
    auto dfs = [&](auto self, int p) -> void {
        ans.push_back(depth[p]);
        for(int c : children_ordered[p]){
            self(self, c);
            ans.push_back(depth[p]);
        }
    };
    dfs(dfs, 0);

    rep(i,ans.size()){
        if(i) cout << ' ';
        cout << ans[i];
    }
    cout << '\n';

    return 0;
}


struct ios_do_not_sync{
    ios_do_not_sync(){
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
    }
} ios_do_not_sync_instance;

Submission Info

Submission Time
Task L - Lexicographic Euler Tour
User Nachia
Language C++ (GCC 9.2.1)
Score 600
Code Size 3737 Byte
Status AC
Exec Time 389 ms
Memory 60468 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 50
Set Name Test Cases
Sample sample_00.txt, sample_01.txt, sample_02.txt
All case_00.txt, case_01.txt, case_02.txt, case_03.txt, case_04.txt, case_05.txt, case_06.txt, case_07.txt, case_08.txt, case_09.txt, case_10.txt, case_11.txt, case_12.txt, case_13.txt, case_14.txt, case_15.txt, case_16.txt, case_17.txt, case_18.txt, case_19.txt, case_20.txt, case_21.txt, case_22.txt, case_23.txt, case_24.txt, case_25.txt, case_26.txt, case_27.txt, case_28.txt, case_29.txt, case_30.txt, case_31.txt, case_32.txt, case_33.txt, case_34.txt, case_35.txt, case_36.txt, case_37.txt, case_38.txt, case_39.txt, case_40.txt, case_41.txt, case_42.txt, case_43.txt, case_44.txt, case_45.txt, case_46.txt, sample_00.txt, sample_01.txt, sample_02.txt
Case Name Status Exec Time Memory
case_00.txt AC 374 ms 56032 KiB
case_01.txt AC 373 ms 54960 KiB
case_02.txt AC 386 ms 58712 KiB
case_03.txt AC 376 ms 56520 KiB
case_04.txt AC 374 ms 56744 KiB
case_05.txt AC 352 ms 50088 KiB
case_06.txt AC 389 ms 60468 KiB
case_07.txt AC 352 ms 49588 KiB
case_08.txt AC 357 ms 50536 KiB
case_09.txt AC 388 ms 60236 KiB
case_10.txt AC 104 ms 37836 KiB
case_11.txt AC 142 ms 44592 KiB
case_12.txt AC 255 ms 34428 KiB
case_13.txt AC 251 ms 34264 KiB
case_14.txt AC 250 ms 35208 KiB
case_15.txt AC 250 ms 34456 KiB
case_16.txt AC 254 ms 34596 KiB
case_17.txt AC 250 ms 34428 KiB
case_18.txt AC 250 ms 34896 KiB
case_19.txt AC 251 ms 34584 KiB
case_20.txt AC 246 ms 34808 KiB
case_21.txt AC 249 ms 35200 KiB
case_22.txt AC 252 ms 34500 KiB
case_23.txt AC 254 ms 34480 KiB
case_24.txt AC 256 ms 35116 KiB
case_25.txt AC 252 ms 34056 KiB
case_26.txt AC 250 ms 34472 KiB
case_27.txt AC 252 ms 34344 KiB
case_28.txt AC 248 ms 35120 KiB
case_29.txt AC 254 ms 34512 KiB
case_30.txt AC 256 ms 35312 KiB
case_31.txt AC 249 ms 35248 KiB
case_32.txt AC 251 ms 34488 KiB
case_33.txt AC 250 ms 35280 KiB
case_34.txt AC 250 ms 34420 KiB
case_35.txt AC 251 ms 35240 KiB
case_36.txt AC 252 ms 34836 KiB
case_37.txt AC 130 ms 20852 KiB
case_38.txt AC 12 ms 4188 KiB
case_39.txt AC 235 ms 32816 KiB
case_40.txt AC 175 ms 27064 KiB
case_41.txt AC 101 ms 17872 KiB
case_42.txt AC 35 ms 7420 KiB
case_43.txt AC 26 ms 6164 KiB
case_44.txt AC 249 ms 34192 KiB
case_45.txt AC 59 ms 11436 KiB
case_46.txt AC 173 ms 26884 KiB
sample_00.txt AC 5 ms 3604 KiB
sample_01.txt AC 4 ms 3540 KiB
sample_02.txt AC 4 ms 3508 KiB