UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解
刘汝佳的题目,悲剧文本 -_-|||
这里使用vector<string>容器倒置记录数据,然后从后面输出就能够了。
难度就是不知道这种文档究竟哪里是開始输出,故此使用动态管理内存的容器比較好做。
添加了io处理的O(n)算法也没有上榜,郁闷。
#include <stdio.h> #include <vector> #include <string> using std::vector; using std::string; const int MAX_B = 5120; int id = 0, len = 0; char buf[MAX_B]; inline char getFromBuf() { if (id >= len) { len = fread(buf, 1, MAX_B, stdin); id = 0; } return buf[id++]; } int oid = 0; int FLASH_P = MAX_B - 2; char outBuf[MAX_B]; inline void charToBuf(char c) { if (oid > FLASH_P) { fwrite(outBuf, 1, oid, stdout); oid = 0; } outBuf[oid++] = c; } inline void flashLeft() { if (oid) fwrite(outBuf, 1, oid, stdout); } int main() { char c; while (c = getFromBuf()) { if (!len) break; vector<string> vstr(1); int cur = 0; int end = 0; while (len && c != '\n') { if (c == '[') { vstr.push_back(string()); end++; cur = end; } else if (c == ']') { if (vstr.size() > 1 && vstr[vstr.size()-1].empty()) end--, vstr.pop_back(); cur = 0; } else vstr[cur].push_back(c); c = getFromBuf(); } for (int i = (int)vstr.size() - 1; i >= 0 ; i--) { for (int j = 0; j < (int)vstr[i].size(); j++) { charToBuf(vstr[i][j]); } } charToBuf('\n'); } flashLeft(); return 0; }