題意:輸出一堆亂排版的html標簽,去多余空字符,轉換為按縮進輸出。
——>>2013年成都區賽題目,當時挺多做不出最後一題的隊伍做出了此題,而我,無限WA到比賽結束。。今天,我AC了。。
題目中有一句話非常重要:you shouldn’t change anything of any tag.
想想規范化後的標簽,只有兩種方式開頭,一種是標簽 < 開頭,另一種是文本開頭。。每種開頭分別對應一種結尾。。
於是,讀標簽
最後,就AC吧。。
#include#include const int MAXN = 200; const char* stop = ; 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(' '); } void GetEntireTag(char* tag) { int len = 0; tag[len++] = '<'; while ((ch = getchar()) && ch != '>') { tag[len++] = ch; } tag[len++] = '>'; tag[len] = ''; } 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: , ++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; }