题意:输出一堆乱排版的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;
}