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