제출 #1176476

#제출 시각아이디문제언어결과실행 시간메모리
1176476lmquanType Printer (IOI08_printer)C++20
100 / 100
75 ms56060 KiB
#define taskname ""
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
const int kNN = 500005;

string result = "", _max = "";

struct Trie {
  struct TNode {
    int child[26], terminal;
  } a[kNN];
  int num_node;


  Trie() : num_node(0) {
    memset(a[num_node].child, -1, sizeof(a[num_node].child));
    a[num_node].terminal = 0;
  }

  void Add(string s) {
    int p = 0;
    for (char x : s) {
      if (a[p].child[x - 'a'] == -1) {
        a[p].child[x - 'a'] = ++num_node;
        memset(a[num_node].child, -1, sizeof(a[num_node].child));
        a[num_node].terminal = 0;
      }
      p = a[p].child[x - 'a'];
    }
    a[p].terminal++;
  }

  void DFS(int d, int node, bool b) {
    for (int i = 1; i <= a[node].terminal; i++) {
      result += 'P';
    }
    if (d == _max.size()) {
      return ;
    }
    if (b) {
      for (int i = 0; i < 26; i++) {
        if (i != (_max[d] - 'a') && (a[node].child[i] != -1)) {
          result += char('a' + i);
          DFS(d + 1, a[node].child[i], false);
          result += '-';
        }
      }
      result += _max[d];
      DFS(d + 1, a[node].child[_max[d] - 'a'], true);
    } else {
      for (int i = 0; i < 26; i++) {
        if (a[node].child[i] != -1) {
          result += char('a' + i);
          DFS(d + 1, a[node].child[i], false);
          result += '-';
        }
      }
    }
  }
};

int main() {
  if (fopen(taskname".inp", "r")) {
    freopen(taskname".inp", "r", stdin);
    freopen(taskname".out", "w", stdout);
  }
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);

  int n;
  cin >> n;

  Trie t;

  for (int i = 1; i <= n; i++) {
    string s;
    cin >> s;
    t.Add(s);
    if (s.size() > _max.size()) {
      _max = s;
    }
  }

  t.DFS(0, 0, true);

  cout << result.size() << '\n';
  for (auto i : result) {
    cout << i << '\n';
  }

  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

printer.cpp: In function 'int main()':
printer.cpp:67:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |     freopen(taskname".inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
printer.cpp:68:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |     freopen(taskname".out", "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...