hdu-4782

注意content中的多个空格,tab,换行都要处理成一个空格,还有文件最后要有换行符,不然PE

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>

using namespace std;

#define F(i, n) for (int i=0;i<(n);++i)
#define LBIT(x) x&-x

int T;
int n;

char _buf[1000000];

class Parser {
public:
    Parser(char * buf):
         level(-1),
         init(false),
         nsize(0),
         buf(_buf){}
	void parse();

	enum tagType {
	open,
	close,
	self_close
    };
private:
	bool eatWhite();
	void outSpace();

	char c;
	int level;
	int type;
	bool init;

	int nsize;
	char * buf;
};

bool Parser::eatWhite() {
	int n = 0;
	while(true) {
		c = getchar();
		if (c == ' ' || c == '\n' || c == 9)
			++n;
		else
			break;
	}
	return n > 0;
}

void Parser::outSpace() {
	for (int i=0;i<level;++i)
		printf(" ");
}

void Parser::parse() {
	bool hasSpace = eatWhite();
	while(true) {
		if (!init)
			init = true;

		nsize = 0;

		if (c == '<') {
		    buf[nsize++]= c;
		    while(true) {
			c = getchar();
			buf[nsize++]= c;

			if (c == '>')
				break;
		    }

		    if (buf[1] == '/')
			type = close;
		    else if (buf[nsize - 2] == '/')
			type = self_close;
		    else
			type = open;

            buf[nsize] = '\0';
		    switch(type) {
		    case close:
            outSpace();
            printf("%s", buf);
			--level;
			break;
		    case open:
			++level;
			outSpace();
            printf("%s", buf);
			break;
		    case self_close:
		        outSpace();
		        cout << ' ';
                printf("%s", buf);
		        break;
		    }

		    if (init && level == -1)
			break;

            putchar('\n');

		    eatWhite();
		} else {
		  buf[nsize++] = c;
		  while(true) {
            c = getchar();
			if (c == '<')
				break;
			else if (c == ' ' || c == '\n' || c == 9) {
				eatWhite();
                if (c == '<')
                    break;
                else {
                   buf[nsize++] = ' ';
                   buf[nsize++] = c;
                }

			}
			else
				buf[nsize++] = c;
		  }

		  buf[nsize] = '\0';
		  outSpace();
		  printf(" %s\n", buf);
		}
	}
}

int main()
{
    freopen("input.in", "r", stdin);
    //freopen("output.out", "w", stdout);

    scanf("%d",&T);

    for (int i=1;i<=T;++i) {
        printf("Case #%d:\n", i);
        Parser parser(_buf);
        parser.parse();

            putchar('\n');
    }

    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值