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 |
|
|
| 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 |