Submission #529746


Source Code Expand

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

int solve(vector<string> in){
    int n = in.size();
    constexpr int C = 26;
    array<array<vector<int>, C>, C> cnt;
    vector<int> ss(n), tt(n);
    
    vector<int> perm(C); iota(perm.begin(), perm.end(), 0);
    random_shuffle(perm.begin(), perm.end());
    rep(i, n){
        string s = in[i];
        for(char &c : s) c = perm[c - 'a'] + 'a';
        cnt[s[0]-'a'][s[s.size()-1]-'a'].emplace_back(i);
        ss[i] = s[0]-'a';
        tt[i] = s[s.size()-1]-'a';
    }
    vector<int> c(C);
    rep(i, C) rep(j, C) c[i] += cnt[i][j].size();
 
    int cnt_odd = 0;
    rep(i, C) cnt_odd += c[i] % 2;
    if(cnt_odd != 1){
        cout << "NO" << endl;
        return 1;
    }
 
    rep(root_s, C){
        if(c[root_s] % 2 == 0) continue;
        rep(root_t, C) if(!cnt[root_s][root_t].empty()){
            auto g = cnt;
 
            int root = g[root_s][root_t].back();
            g[root_s][root_t].pop_back();
 
            vector<int> inner_t_cnt(C);
            rep(i, C) inner_t_cnt[i] = (c[i] - (root_s == i))/2 - (i == root_t);
            // rep(i, C) cout << inner_t_cnt[i] << " "; cout << endl;
            vector<int> par(n);
            queue<int> q; q.emplace(root);
            while(!q.empty()){
                int u = q.front(); q.pop();
                int s = tt[u];
 
                vector<int> cs(C);
                rep(i, C) cs[i] = i;
                sort(begin(cs), end(cs), [&](int a, int b){
                        return inner_t_cnt[a] > inner_t_cnt[b];});
 
                int can = 0;
                for(auto t : cs) can += g[s][t].size();
                if(can < 2) continue; // leaf
 
                int cnt_ch = 0;
                for(auto t : cs){
                    rep(_, 2) if(cnt_ch < 2 and !g[s][t].empty() and inner_t_cnt[t] >= 1){
                        --inner_t_cnt[t];
                        int v = g[s][t].back(); g[s][t].pop_back();
                        q.emplace(v);
                        par[v] = u+1;
                        ++cnt_ch;
                    }
                }
                for(auto t : cs){
                    rep(_, 2) if(cnt_ch < 2 and !g[s][t].empty()){
                        // use as leaf
                        int v = g[s][t].back(); g[s][t].pop_back();
                        q.emplace(v);
                        par[v] = u+1;
                        ++cnt_ch;
                    }
                }
            }
            int cnt_zero = 0;
            rep(i, n) cnt_zero += par[i] == 0;
            if(cnt_zero == 1){
                cout << "YES" << endl;
                rep(i, n) cout << par[i] << endl;
                return 1;
            }
        }
    }
    return 0;
}
int main(void){
    int n; cin >> n;
    vector<string> s(n);
    rep(i, n){
        cin >> s[i];
    }
    rep(i, 100) if(solve(s)) return 0;
    cout << "NO" << endl;
    return 0;
}

Submission Info

Submission Time
Task B - しりとり木
User Mi_kugi
Language C++11 (GCC 4.9.2)
Score 100
Code Size 3068 Byte
Status AC
Exec Time 769 ms
Memory 2320 KiB

Judge Result

Set Name base All
Score / Max Score 99 / 99 1 / 1
Status
AC × 27
AC × 34
Set Name Test Cases
base corner01.txt, corner02.txt, corner03.txt, corner04.txt, corner05.txt, corner06.txt, corner07.txt, corner08.txt, corner09.txt, corner10.txt, corner11.txt, corner12.txt, corner13.txt, corner14.txt, random01.txt, random02.txt, random03.txt, random04.txt, random05.txt, random06.txt, random07.txt, random08.txt, random09.txt, random10.txt, sample_01.txt, sample_02.txt, sample_03.txt
All corner01.txt, corner02.txt, corner03.txt, corner04.txt, corner05.txt, corner06.txt, corner07.txt, corner08.txt, corner09.txt, corner10.txt, corner11.txt, corner12.txt, corner13.txt, corner14.txt, extra01.txt, extra02.txt, extra03.txt, extra04.txt, extra05.txt, extra06.txt, extra07.txt, random01.txt, random02.txt, random03.txt, random04.txt, random05.txt, random06.txt, random07.txt, random08.txt, random09.txt, random10.txt, sample_01.txt, sample_02.txt, sample_03.txt
Case Name Status Exec Time Memory
corner01.txt AC 53 ms 1684 KiB
corner02.txt AC 212 ms 2316 KiB
corner03.txt AC 80 ms 2184 KiB
corner04.txt AC 769 ms 2320 KiB
corner05.txt AC 70 ms 2192 KiB
corner06.txt AC 68 ms 2124 KiB
corner07.txt AC 34 ms 1420 KiB
corner08.txt AC 40 ms 1612 KiB
corner09.txt AC 38 ms 1416 KiB
corner10.txt AC 173 ms 2128 KiB
corner11.txt AC 36 ms 1428 KiB
corner12.txt AC 37 ms 1348 KiB
corner13.txt AC 79 ms 2312 KiB
corner14.txt AC 58 ms 1840 KiB
extra01.txt AC 50 ms 1680 KiB
extra02.txt AC 35 ms 1424 KiB
extra03.txt AC 37 ms 1428 KiB
extra04.txt AC 37 ms 1456 KiB
extra05.txt AC 36 ms 1420 KiB
extra06.txt AC 36 ms 1488 KiB
extra07.txt AC 36 ms 1464 KiB
random01.txt AC 71 ms 2108 KiB
random02.txt AC 69 ms 2136 KiB
random03.txt AC 70 ms 2108 KiB
random04.txt AC 69 ms 2096 KiB
random05.txt AC 69 ms 2184 KiB
random06.txt AC 69 ms 2200 KiB
random07.txt AC 50 ms 2196 KiB
random08.txt AC 51 ms 2224 KiB
random09.txt AC 51 ms 2192 KiB
random10.txt AC 50 ms 2196 KiB
sample_01.txt AC 36 ms 1416 KiB
sample_02.txt AC 35 ms 1420 KiB
sample_03.txt AC 38 ms 1448 KiB