UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解
刘汝佳的题目,悲剧文本 -_-|||这里使用vector容器倒置记录数据,然后从后面输出就可以了。难度就是不知道这样的文档到底哪里是开始输出,故此使用动态管理内存的容器比较好做。增加了io处理的O(n)算法也没有上榜,郁闷。#include#include#includeusing std::vector;using std::string;const int M
·
刘汝佳的题目,悲剧文本 -_-|||
这里使用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;
}
更多推荐
已为社区贡献4条内容
所有评论(0)