제출 #1178156

#제출 시각아이디문제언어결과실행 시간메모리
1178156giabao249Type Printer (IOI08_printer)C++20
0 / 100
20 ms37956 KiB
#include<bits/stdc++.h> using namespace std; #define el '\n' const int N = 25005; const int ALPHA_BET = 26; const int inf = 2e9; template<class T> bool ckmax(T& a, const T&b) { return a < b ? a = b, 1 : 0; } int n; struct Node { Node*child[ALPHA_BET]; int exits, best, isMax; Node() { for(int i = 0 ; i < ALPHA_BET ; i++) { child[i] = nullptr; } exits = 0, best = 0 , isMax = 0; } }; struct state{ }; int cur = 0; Node *root; void addString(string s , bool maxString) { Node *p = root; for(char f : s) { int c = f - 'a'; if(p->child[c] == nullptr) { p->child[c] = new Node(); // p->child[c]->depth = p->depth + 1; } p = p->child[c]; p->isMax = maxString; } p->isMax = maxString; p->exits++; } vector<char> ret; struct State { Node* node; int idx; // chỉ số của con đang được duyệt bool visited; // dùng để đánh dấu sau khi đã thêm ký tự cho nút đó (nếu cần) bool chillUsed; // đánh dấu xem đã xử lý con 'chillGuy' hay chưa }; string ans = ""; void solve_iterative(Node* root) { // Sử dụng stack để lưu trạng thái của các nút stack<State> st; st.push({root, 0, false, false}); while(!st.empty()){ State &curState = st.top(); Node *curNode = curState.node; // Nếu nút hiện tại là nút kết thúc chuỗi if(curNode->exits > 0 && !curState.visited) { ans += 'P'; st.pop(); continue; } // Nếu đã duyệt hết các con của nút hiện tại if(curState.idx >= ALPHA_BET) { st.pop(); if(!st.empty()){ // Sau khi trở về nút cha, thêm dấu '-' nếu cần ans += '-'; } continue; } // Duyệt con tại vị trí curState.idx Node *child = curNode->child[curState.idx]; char letter = 'a' + curState.idx; curState.idx++; // tăng idx cho nút hiện tại if(child == nullptr) continue; // bỏ qua nếu không tồn tại // Nếu con này là "chillGuy" (theo logic của bạn: có isMax = true) if(child->isMax && !curState.chillUsed) { // Đánh dấu đã dùng chillGuy để đảm bảo xử lý sau tất cả các con khác curState.chillUsed = true; ans += letter; st.push({child, 0, false, false}); } else if(!child->isMax) { // Với các nút không phải chillGuy, xử lý ngay ans += letter; st.push({child, 0, false, false}); } } } void solve(Node *p) { if(p->exits > 0){ ans += ('P'); return; } int chillGuy = -1; for(int i = 0 ; i < ALPHA_BET ; i++){ if(p->child[i]){ if(p->child[i]->isMax){ chillGuy = i; continue; } ans += (char(i + 'a')); solve(p->child[i]); ans += ('-'); } } if(chillGuy != -1){ ans += (char(chillGuy + 'a')); solve(p->child[chillGuy]); } } void GOTO_OLP2025() { root = new Node(); cin >> n; string maxString; int mx = 0; for(int i = 0 ; i < n ; i++) { string s ; cin >> s; addString(s , 0); if(ckmax(mx , (int)s.size())){ maxString = s; } } addString(maxString , 1); // solve(root); solve_iterative(root); cout << ans.size() << el; for(char c : ans) cout << c << el; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); // freopen("Task.in", "r", stdin); GOTO_OLP2025(); }
#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...