답안 #531591

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
531591 2022-03-01T05:30:44 Z erke Type Printer (IOI08_printer) C++11
100 / 100
136 ms 120144 KB
#include <bits/stdc++.h>
using namespace std;

struct Node {
  bool isLeaf;
  vector<Node*> adj;
  int dep, far;
  Node(): isLeaf(false), adj(26, nullptr), dep(0), far(-1) {}
};

struct Trie {
  Node* root;
  Trie() { root = new Node; }
  void insert(Node* &node, int pos, string &s) {
    if (node == nullptr) node = new Node;
    if (pos == (int) s.size()) {
      node->isLeaf = true;
      return;
    }
    insert(node->adj[s[pos] - 'a'], pos + 1, s);
    node->dep = max(node->dep, node->adj[s[pos] - 'a']->dep + 1);
    if (node->far == -1 || node->adj[s[pos] - 'a']->dep > node->adj[node->far]->dep) {
      node->far = s[pos] - 'a';
    }
  }
  void insert(string &s) {
    insert(root, 0, s);
  }
};

void dfs(Node* node, vector<char> &res) {
  if (node->isLeaf) {
    res.push_back('P');
  }
  for (int i = 0; i < 26; i++) {
    if (node->adj[i] != nullptr && i != node->far) {
      res.push_back((char)('a' + i));
      dfs(node->adj[i], res);
      res.push_back('-');
    }
  }
  if (node->far != -1) {
    res.push_back((char)('a' + node->far));
    dfs(node->adj[node->far], res);
    res.push_back('-');
  }
}

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n; cin >> n;
  Trie trie;
  for (int i = 0; i < n; i++) {
    string s;
    cin >> s;
    trie.insert(s);
  }
  vector<char> res;
  dfs(trie.root, res);
  while (res.back() == '-') {
    res.pop_back();
  }
  cout << res.size() << '\n';
  for (auto &i : res) {
    cout << i << '\n';
  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 2 ms 1228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 2124 KB Output is correct
2 Correct 3 ms 2636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 7116 KB Output is correct
2 Correct 20 ms 15044 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 17728 KB Output is correct
2 Correct 8 ms 3928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 44120 KB Output is correct
2 Correct 124 ms 101072 KB Output is correct
3 Correct 62 ms 52016 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 34512 KB Output is correct
2 Correct 136 ms 120144 KB Output is correct
3 Correct 75 ms 59068 KB Output is correct
4 Correct 127 ms 113420 KB Output is correct