本文主要是介绍hdu - 4782 - Beautiful Soup(模拟),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:输出一堆乱排版的html标签,去多余空字符,转换为按缩进输出。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4782
——>>2013年成都区赛题目,当时挺多做不出最后一题的队伍做出了此题,而我,无限WA到比赛结束。。今天,我AC了。。
题目中有一句话非常重要:you shouldn’t change anything of any tag.
想想规范化后的标签,只有两种方式开头,一种是标签 < 开头,另一种是文本开头。。每种开头分别对应一种结尾。。
于是,读标签<xxx>时一直读到标签尾。。读文本时一直读到文本尾。。
最后,就AC吧。。
#include <cstdio>
#include <cstring>const int MAXN = 200;
const char* stop = "</html>";char ch;bool IsSpace(char ch)
{return ch == 32 || ch == 9 || ch == 10;
}void PrintSpace(int n)
{while (n--){putchar(' ');}
}void RemoveSpace()
{while ((ch = getchar()) && IsSpace(ch));
}void Enter()
{putchar('\n');
}void GetEntireTag(char* tag)
{int len = 0;tag[len++] = '<';while ((ch = getchar()) && ch != '>'){tag[len++] = ch;}tag[len++] = '>';tag[len] = '\0';
}void OutputTag(const char* tag, const int& spaceCnt)
{if (tag[1] == '/'){PrintSpace(spaceCnt - 1);}else{PrintSpace(spaceCnt);}puts(tag);
}void UpdateSpace(const char* tag, int& spaceCnt)
{int len = strlen(tag);if (tag[1] != '/' && tag[len - 2] != '/'){++spaceCnt;}else if (tag[1] == '/'){--spaceCnt;}
}void GetAndOutputEntireText(const int& spaceCnt)
{PrintSpace(spaceCnt);putchar(ch);while ((ch = getchar()) && ch != '<'){if (IsSpace(ch)){RemoveSpace();if (ch == '<') break;else{PrintSpace(1);putchar(ch);}}else{putchar(ch);}}Enter();
}int main()
{int T, kase = 0;char tag[MAXN];scanf("%d", &T);getchar();while (T--){int spaceCnt = 0;ch = getchar();printf("Case #%d:\n", ++kase);while (true){if (IsSpace(ch)){RemoveSpace();}else if (ch == '<'){GetEntireTag(tag);OutputTag(tag, spaceCnt);if (strcmp(tag, stop) == 0) break;UpdateSpace(tag, spaceCnt);ch = getchar();}else{GetAndOutputEntireText(spaceCnt);}}}return 0;
}
这篇关于hdu - 4782 - Beautiful Soup(模拟)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!