CCF 201809-3 元素选择器(80分答案)
题目分析
CCF的第三道题,一般考察的是模拟和文本处理,题目难度不大,但是相当繁琐。按照题目的要求做,需要仔细认真的读题。我使用的是ArrayList解题,看到网上各位大佬使用的方法都是用树作为数据结构,可能这是我代码繁琐和最后出错的原因。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
class HTMLElement
{
public String name;
public String id;
public int layer;
public HTMLElement(String name, int layer) {
this.name = name;
this.layer = layer;
this.id = null;
}
}
public HTMLElement getLayers(String string)
{
char[] chars = string.toCharArray();
int pointCount = 0;
while(chars[pointCount]=='.')
{
pointCount++;
}
int layer = pointCount/2;
String name = string.substring(pointCount,chars.length).toLowerCase();
HTMLElement element = new HTMLElement(name,layer);
return element;
}
public HTMLElement processString(String string)
{
String[] strings = string.split(" ");
HTMLElement element = getLayers(strings[0]);
if(strings.length==1)
{
return element;
}
element.id = strings[1];
return element;
}
public ArrayList<Integer> findElements(ArrayList<HTMLElement> elements, String[] strings)
{
ArrayList<Integer> results = new ArrayList<Integer>();
int ruleCounter = 0;
int layerCounter = 0;
boolean isStart = true;
int lastCheckIndex = 0;
for(int j=0;j<elements.size();j++)
{
HTMLElement curElement = elements.get(j);
String s = curElement.name;
if(strings[ruleCounter].startsWith("#"))
s = curElement.id;
if(s!=null&&isStart&&s.equals(strings[ruleCounter]))
{
layerCounter = curElement.layer;
ruleCounter++;
isStart = false;
lastCheckIndex = j;
}
else if(!isStart&&curElement.layer<layerCounter)
{
ruleCounter = 0;
isStart = true;
j = lastCheckIndex;
}
else if(s!=null&&s.equals(strings[ruleCounter])&&curElement.layer>layerCounter)
{
layerCounter = curElement.layer;
ruleCounter++;
}
if(ruleCounter==strings.length)
{
ruleCounter--;
if(strings.length==1)
isStart = true;
if(!results.contains(j+1))
results.add(j+1);
//j = lastCheckIndex;
}
}
int size = results.size();
results.add(0,size);
return results;
}
public void run() {
ArrayList<HTMLElement> elements = new ArrayList<HTMLElement>();
Scanner in = new Scanner(System.in);
String num = in.nextLine();
String[] nums = num.split(" ");
int htmlLinesNum = Integer.valueOf(nums[0]);
int searchNum = Integer.valueOf(nums[1]);
for(int i=0;i<htmlLinesNum;i++)
{
try {
String line = in.nextLine();
HTMLElement element = processString(line);
elements.add(element);
} catch (Exception e) {
e.printStackTrace();
}
}
for(int i=0;i<searchNum;i++)
{
try {
String line = in.nextLine();
ArrayList<Integer> integers = findElements(elements, line.split(" "));
String s = "";
for(Integer j:integers)
{
s = s + " "+j.toString();
}
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Main main = new Main();
main.run();
}
}