Submission #1108146

#TimeUsernameProblemLanguageResultExecution timeMemory
1108146vjudge1Type Printer (IOI08_printer)C++17
100 / 100
118 ms55996 KiB
#include <iostream> #include <vector> #include <algorithm> int main(){ std::cin.tie(nullptr)->sync_with_stdio(false); int n; std::cin >> n; std::vector<std::vector<std::pair<char,int>>> trie(500001); std::vector<std::vector<int>> subtreeSize(500001, std::vector<int>(2)); std::vector<bool> finalVertex(500001); int curVertices = 0; for(int i = 0; i < n; i++){ std::string s; std::cin >> s; int m = (int) s.length(); int curVertex = 0; for(int j = 0; j < m; j++){ bool found = false; for(std::pair<char,int> & p : trie[curVertex]){ if(p.first == s[j]){ found = true; curVertex = p.second; break; } } if(found == false){ curVertices += 1; trie[curVertex].push_back({s[j], curVertices}); curVertex = curVertices; } if(j == (m - 1)){ finalVertex[curVertex] = true; } } } auto dfs = [&trie, &subtreeSize](int u, int p, auto && self) -> void { subtreeSize[u][0] += 1; subtreeSize[u][1] = 1; for(std::pair<char,int> & v : trie[u]){ if(v.second != p){ self(v.second, u, self); subtreeSize[u][0] += subtreeSize[v.second][0]; subtreeSize[u][1] = std::max(subtreeSize[u][1], 1 + subtreeSize[v.second][1]); } } }; dfs(0, 0, dfs); for(int i = 0; i <= curVertices; i++){ sort(trie[i].begin(), trie[i].end(), [&subtreeSize](const std::pair<char,int> & a, const std::pair<char,int> & b) -> bool { return 2*subtreeSize[a.second][0] + (2*subtreeSize[b.second][0] - subtreeSize[b.second][1]) < 2*subtreeSize[b.second][0] + (2*subtreeSize[a.second][0] - subtreeSize[a.second][1]); }); } int built = 0; std::vector<char> operations; auto build = [&trie, &curVertices, &finalVertex, &built, &operations](char c, int u, int p, auto && self) -> void{ if(u != 0){ operations.push_back(c); built += 1; } if(finalVertex[u]){ operations.push_back('P'); } for(std::pair<char,int> & v : trie[u]){ if(v.second != p){ self(v.first, v.second, u, self); } } if(built < curVertices){ operations.push_back('-'); } }; build('0', 0, 0, build); std::cout << operations.size() << '\n'; for(char & c : operations){ std::cout << c << '\n'; } }
#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...