PKU : 2022 - Syntax Included
問題概要
http://poj.org/problem?id=2022
HTMLの文が与えられるので, これが正しい構文かどうか解析してください.
プログラム
bool TEXT(); int n,idx; char s[1010]; bool URL(){ if(strncmp(&s[idx],"http://",7)) return false; idx += 7; char buff[1010]; for(int j=0;s[idx];j++,idx++){ if(s[idx] == '<'){ return false; } if(s[idx] == '>'){ if(j >= 4 && !strncmp(&buff[j-4],".com",4)) return true; else return false; } buff[j] = s[idx]; } return false; } bool LINK(){ if(strncmp(&s[idx],"<A HREF=",8)) return false; idx += 8; if(!URL()) return false; if(s[idx++] != '>') return false; if(!TEXT()) return false; if(strncmp(&s[idx],"</A>",4)) return false; idx += 4; return true; } bool ITALICS(){ if(strncmp(&s[idx],"<I>",3)) return false; idx += 3; if(!TEXT()) return false; if(strncmp(&s[idx],"</I>",4)) return false; idx += 4; return true; } bool BOLD(){ if(strncmp(&s[idx],"<B>",3)) return false; idx += 3; if(!TEXT()) return false; if(strncmp(&s[idx],"</B>",4)) return false; idx += 4; return true; } bool TAG(){ if(!strncmp(&s[idx],"<B>",3)) return BOLD(); else if(!strncmp(&s[idx],"<I>",3)) return ITALICS(); else if(!strncmp(&s[idx],"<A ",3)) return LINK(); return false; } bool TEXT(){ while(s[idx]){ if(s[idx] == '>') return false; if(s[idx] == '<'){ if(strncmp(&s[idx],"<B>",3) && strncmp(&s[idx],"<I>",3) && strncmp(&s[idx],"<A ",3)) return true; bool tmp = TAG(); if(!tmp) return false; } else{ idx++; } } return true; } bool BODY(){ if(strncmp(&s[idx],"<BODY>",6)) return false; idx += 6; if(!TEXT()) return false; if(strncmp(&s[idx],"</BODY>",7)) return false; idx += 7; return true; } bool HTML(){ if(strncmp(&s[idx],"<HTML>",6)) return false; idx += 6; if(!BODY()) return false; if(strncmp(&s[idx],"</HTML>",7)) return false; idx += 7; return !s[idx]; } int main(void){ int T; scanf(" %d ",&T); while(T--){ fgets(s,1020,stdin); n = strlen(s); s[n-1] = 0; idx = 0; printf("%sSyntax Included\n", HTML() ? "" : "No "); } }