# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
652563 | 2022-10-23T06:47:00 Z | alvinpiter | Type Printer (IOI08_printer) | C++17 | 1000 ms | 99032 KB |
/* * Insert each word into a trie * "Add" operation is the same as going an edge downward, while "Remove" operation is the same as going an edge upward. If there is a requirement that the printer must be empty after all operations are performed, then the answer is 2 * numberOfEdgesInTheTrie + numberOfWords. * However, we are allowed to leave some letters in the printer, so it is best if we leave the longest word in the printer. */ #include<bits/stdc++.h> using namespace std; struct TrieNode { int maxDepth; bool isEndOfAWord; TrieNode* children[26]; TrieNode(): maxDepth(0), isEndOfAWord(false) {} }; void insert(TrieNode* root, string s) { TrieNode* currentNode = root; for (int i = 0; i < s.length(); i++) { int charIndex = (s[i] - 'a'); currentNode->maxDepth = max(currentNode->maxDepth, (int) s.length() - i); if (currentNode->children[charIndex] == NULL) { currentNode->children[charIndex] = new TrieNode(); } currentNode = currentNode->children[charIndex]; } currentNode->isEndOfAWord = true; } void traverse(TrieNode* root, vector<char>& result) { if (root->isEndOfAWord) { result.push_back('P'); } int deepestChildIdx = -1; for (int i = 0; i < 26; i++) { if (root->children[i] != NULL && (deepestChildIdx == -1 || root->children[deepestChildIdx]->maxDepth < root->children[i]->maxDepth)) { deepestChildIdx = i; } } for (int i = 0; i < 26; i++) { if (root->children[i] != NULL && i != deepestChildIdx) { result.push_back((char) (i + 'a')); traverse(root->children[i], result); } } if (deepestChildIdx != -1) { result.push_back((char) (deepestChildIdx + 'a')); traverse(root->children[deepestChildIdx], result); } result.push_back('-'); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; TrieNode* trieRoot = new TrieNode(); for (int i = 0; i < n; i++) { string s; cin >> s; insert(trieRoot, s); } vector<char> result; traverse(trieRoot, result); while (result.back() == '-') { result.pop_back(); } cout << result.size() << endl; for (auto r: result) { cout << r << endl; } }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 212 KB | Output is correct |
2 | Correct | 1 ms | 212 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 212 KB | Output is correct |
2 | Correct | 1 ms | 212 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 340 KB | Output is correct |
2 | Correct | 1 ms | 212 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 340 KB | Output is correct |
2 | Correct | 1 ms | 212 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 3 ms | 340 KB | Output is correct |
2 | Correct | 11 ms | 1148 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 21 ms | 1748 KB | Output is correct |
2 | Correct | 24 ms | 2256 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 70 ms | 5916 KB | Output is correct |
2 | Correct | 149 ms | 12592 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 180 ms | 14636 KB | Output is correct |
2 | Correct | 48 ms | 3244 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 425 ms | 36492 KB | Output is correct |
2 | Correct | 930 ms | 83404 KB | Output is correct |
3 | Correct | 481 ms | 43212 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 365 ms | 28408 KB | Output is correct |
2 | Execution timed out | 1096 ms | 99032 KB | Time limit exceeded |
3 | Halted | 0 ms | 0 KB | - |