hdu-4782

来源:互联网 发布:台湾国护照贴纸 知乎 编辑:程序博客网 时间:2024/06/05 10:29

注意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&-xint 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;elsebreak;}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;    elsetype = 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;                }}elsebuf[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 0
原创粉丝点击