首页 > 代码库 > UVa 11988 - Broken Keyboard (a.k.a. Beiju Text) 题解

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;
}