# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
652564 | 2022-10-23T06:49:17 Z | alvinpiter | Type Printer (IOI08_printer) | C++17 | 1000 ms | 99056 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) {} }; vector<char> result; 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) { 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]); } } if (deepestChildIdx != -1) { result.push_back((char) (deepestChildIdx + 'a')); traverse(root->children[deepestChildIdx]); } 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); } traverse(trieRoot); 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 | 0 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 | 1108 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 18 ms | 1832 KB | Output is correct |
2 | Correct | 25 ms | 2256 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 79 ms | 6020 KB | Output is correct |
2 | Correct | 169 ms | 12496 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 182 ms | 14692 KB | Output is correct |
2 | Correct | 49 ms | 3232 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 488 ms | 36572 KB | Output is correct |
2 | Execution timed out | 1002 ms | 83304 KB | Time limit exceeded |
3 | Halted | 0 ms | 0 KB | - |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 372 ms | 28432 KB | Output is correct |
2 | Execution timed out | 1083 ms | 99056 KB | Time limit exceeded |
3 | Halted | 0 ms | 0 KB | - |