제출 #1201295

#제출 시각아이디문제언어결과실행 시간메모리
1201295ziad3ssam10Type Printer (IOI08_printer)C++20
0 / 100
1 ms328 KiB
#pragma GCC optimize("Ofast")

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

#define ll long long
#define endl '\n'
#define ordered_set tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update>
#define wady ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

void files() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
}

struct Trie {
    struct Node {
        int child[26] = {}, cnt = 0;
        bool done = 0, longest = 0;
    };
    vector<Node> trie;

    Trie() { trie.emplace_back(); }

    void add(string &s, int l) {
        int cur = 0;
        for (auto &c: s) {
            if (!trie[cur].child[c - 'a']) {
                trie[cur].child[c - 'a'] = trie.size();
                trie.emplace_back();
            }
            cur = trie[cur].child[c - 'a'];
            if (!l)trie[cur].cnt++;
            trie[cur].longest = l;
        }
        trie[cur].done = 1;
    }

    string ans = "";

    void dfs(int node) {
        if (trie[node].done)
            ans.push_back('P');

        int temp = -1;
        for (int i = 0; i < 26; i++) {
            int nxt = trie[node].child[i];
            if (nxt) {
                if (trie[nxt].longest) temp = i;
                else {
                    ans.push_back('a' + i);
                    dfs(nxt);
                    ans.push_back('-');
                }
            }
        }
        if (~temp) {
            ans += temp + 'a';
            dfs(trie[node].child[temp]);
            ans += '-';
        }
    }

    void output() {
        while (ans[ans.size() - 1] == '-')ans.pop_back();
        cout << ans.size() << endl;
        for (auto ch: ans)cout << ch << endl;
    }
};

void solve(int tc) {
    int n;
    cin >> n;
    vector<string> a(n);
    string lon = "";
    Trie trie;
    for (auto &s: a)cin >> s;
    sort(a.begin(), a.end());
    for (auto &i: a) {
        trie.add(i, 0);
        if (i.size() > lon.size())lon = i;
    }
    trie.add(lon, 1);
    trie.dfs(0);
    trie.output();
}

signed main() {
    wady
    files();
    int tt = 1;
    //cin >> tt;
    while (tt--) solve(tt);
}

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

printer.cpp: In function 'void files()':
printer.cpp:17:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |     freopen("in.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
printer.cpp:18:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |     freopen("out.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...