Submission #1176317

#TimeUsernameProblemLanguageResultExecution timeMemory
1176317qrq4Type Printer (IOI08_printer)C++20
0 / 100
1096 ms576 KiB
#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define int long long
#define ld long double
#define ull unsigned long long
#define all(v) v.begin(), v.end()
#define point complex<ld>
#define QRQ4                    \
  ios_base::sync_with_stdio(0); \
  cin.tie(0);                   \
  cout.tie(0);
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
const int mod = 1e9 + 7;
const int inf = 1e18;
const int N = 1e6 + 5;
const ld pi = acos(-1);
const ld eps = 1e-9;
using namespace std;
using namespace __gnu_pbds;

int mx[N];
vector<char> ans;

struct Trie
{
  struct Node
  {
    int vis[26]{};
    int p = 0, en = 0;
  };

  vector<Node> tree;
  Trie() { tree.emplace_back(); }
  void insert(string s)
  {
    int idx = 0;
    for (auto &i : s)
    {
      int c = i - 'a';
      if (!tree[idx].vis[c])
      {
        tree[idx].vis[c] = tree.size();
        tree.emplace_back();
      }
      idx = tree[idx].vis[c];
      tree[idx].p++;
    }
    tree[idx].en++;
  }
  int query(string s)
  {
    int idx = 0;
    for (auto &i : s)
    {
      int c = i - 'a';
      if (!tree[idx].vis[c])
        return -1;
      idx = tree[idx].vis[c];
    }
    return tree[idx].p;
  }
};

void dfs(int node, int d, Trie &adj)
{
  mx[node] = d;
  for (int i = 0; i < 26; ++i)
  {
    if (!adj.tree[node].vis[i])
      continue;
    dfs(adj.tree[node].vis[i], d + 1, adj);
    mx[node] = max(mx[node], mx[adj.tree[node].vis[i]]);
  }
}

void dfs2(int node, Trie &adj)
{
  if (adj.tree[node].en)
    ans.push_back('P');
  for (int i = 0; i < 26; ++i)
  {
    if (!adj.tree[node].vis[i] or mx[node] == mx[adj.tree[node].vis[i]])
      continue;
    ans.push_back('a' + i);
    dfs2(adj.tree[node].vis[i], adj);
  }
  for (int i = 0; i < 26; ++i)
  {
    if (!adj.tree[node].vis[i] or mx[node] != mx[adj.tree[node].vis[i]])
      continue;
    ans.push_back('a' + i);
    dfs2(adj.tree[node].vis[i], adj);
  }
  ans.push_back('-');
}

void solve()
{
  int n;
  cin >> n;
  Trie trie;
  for (int i = 0; i < n; ++i)
  {
    string s;
    cin >> s;
    trie.insert(s);
  }
  dfs(0, 0, trie);
  dfs2(0, trie);
  while (ans.back() != 'P')
    ans.pop_back();
  cout << ans.size() << '\n';
  for (auto &it : ans)
    cout << it << '\n';
}

signed main()
{
  QRQ4
#ifndef ONLINE_JUDGE
      freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
#endif
  int T = 1;
  // cin >> T;
  while (T--)
    solve();
  return 0;
}

Compilation message (stderr)

printer.cpp: In function 'int main()':
printer.cpp:122:14: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  122 |       freopen("input.txt", "r", stdin);
      |       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
printer.cpp:123:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |   freopen("output.txt", "w", stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...