PKU 2022-Syntax Included

問題概要

入力が問題に与えられたHTMLの形式を満しているか調べる問題

解法

実装するだけ.
若干嵌りやすい問題かも

実装(Java)

import java.util.*;
import java.math.*;
import java.io.*;
import java.util.regex.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
import static java.lang.System.*;

public class Main {
	Scanner cin;

	void run(){
		cin=new Scanner(System.in);
		int T=Integer.parseInt(cin.nextLine());
		for(int tt=0;tt<T;tt++){
			String in=cin.nextLine();
			Boolean ok=true;
			if(!in.startsWith("<HTML><BODY>"))ok=false;
			if(!in.endsWith("</BODY></HTML>"))ok=false;
			if(ok){
				in=in.substring(12,in.length()-(12+2));
				//<>の対応関係を調べる
				int back=-1;
				for(int i=0;i<in.length();i++){
					if(in.charAt(i)=='<'){
						if(back==-1)
							back=1;
						else
							ok=false;
					}
					if(in.charAt(i)=='>'){
						if(back==1)
							back=-1;
						else
							ok=false;
					}
				}
			}
			if(ok){
				//タグに分割
				List<String> tags=new ArrayList<String>();
				Stack<String> stack=new Stack<String>();

				String now="";
				for(int i=0;i<in.length();i++){
					if(in.charAt(i)=='<'){
						for(int j=i+1;j<in.length();j++){
							if(in.charAt(j)=='>'){
								//printf("%s\n",in.substring(i+1,j));
								tags.add(in.substring(i+1,j));
								break;
							}
						}
					}
				}
				for(String tmp:tags){
					if(tmp.startsWith("/")){
						tmp=tmp.substring(1);
						if(tmp.equals("B")==false&&tmp.equals("I")==false&&tmp.equals("A")==false){
							ok=false;
							break;
						}
						if(stack.empty()||stack.lastElement().equals(tmp)==false){
							ok=false;
							break;
						}
						stack.pop();
					}else{
						if(tmp.equals("B")||tmp.equals("I")){
							stack.add(tmp);
						}else if(tmp.startsWith("A HREF=")){
							stack.add("A");
							tmp=tmp.substring(7);
							//printf("%s\n",tmp);
							if(tmp.startsWith("http://")&&tmp.endsWith(".com")){
								if(tmp.contains(" ")){
									ok=false;
									break;
								}
							}else{
								ok=false;
								break;
							}
						}else{
							ok=false;
							break;
						}
					}
				}
				if(stack.empty()){

				}else{
					ok=false;
				}
			}
			printf("%sSyntax Included\n",ok?"":"No ");
		}
	}

	void printf(String format,Object... args){
		System.out.printf(format, args);
	}

	public static void main(String[] args) {
		new Main().run();
	}

}