CCF元素选择器(JAVA 版)

其实这道题和那道化学方程式差不多,都是都是用了缩小待处理区间的思想

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class 元素选择器1 {
    public static class Node{
        String name;
        String id;
        int level;
        public Node(String name, String id, int level) {
            this.name = name;
            this.id = id;
            this.level = level;
        }
    }
    static int n;
    static Node[] tree = new Node[105];
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        int m = scanner.nextInt();
        scanner.nextLine();
        for(int i = 0; i < n ; i++) {
            String str = scanner.nextLine();
            int j = 0;
            while(str.charAt(j)=='.') j++;
            int level = j/2;
            str = str.substring(j);
            String[] split = str.split(" ");
            if(split.length!=1) {//有ID
                tree[i] = new Node(split[0].toLowerCase(), split[1], level);
            }else {
                tree[i] = new Node(split[0].toLowerCase(), null, level);
            }
        }
        while(m-->0) {
            String qs = scanner.nextLine();
            process(qs);
        }
    }
    private static void process(String qs) {
        String[] split = qs.split(" ");
        for(int i = 0 ; i < split.length;i++) {//变小写
            if(!split[i].contains("#")) split[i] = split[i].toLowerCase();
        }
        int k = split.length,s = 0;
        ArrayList<Integer> list = new ArrayList<>();
        find(s,k,-1,split,0,list);
        Collections.sort(list);
        int last  = -1,count = 0;
        String res = "";
        for(int i = 0 ; i < list.size() ; i++) {//去重+按序输出
            int a = list.get(i);
            if(last!=a) {
                res = res+ " "+a;
                count++;
                last = a;
            }
        }
        System.out.println(count+res);
    }
    //s~~k 去匹配 l~~n
    private static void find(int s, int k,int level,String[] q, int l, ArrayList<Integer> list) {
        if(s==k) {
            list.add(l);//匹配成功
            return;
        }
        if(l==n) return;//匹配到最后都没成功
        for(int i = l; i < n ; i++) {
            if(level >= tree[i].level) return;//越级,匹配失败
            if( q[s].equals(tree[i].name)||q[s].equals(tree[i].id)) {
                find(s+1,k,tree[i].level,q,i+1,list);
            }
        }
    }
}

附样例

17 5
html
..head
....title
..body
....h1
....P #Sub
....Div #main
......h2
....div
....p
....diV
......p #one
......dIv
........P #two
..div
....div
......p
p
#Sub
h3
Div p
Div Div P

输出

5 6 10 12 14 17
1 6
0
3 12 14 17
2 14 17
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 5,366评论 0 2
  • 高中生如何整理错题经验 题主是一名高一学生。在我的学习生涯里,很少有收集错题的习惯。但是一直听别人建议收集错题,说...
    菁颜阅读 10,953评论 1 20
  • 我看到了你 就那样站在树下 直直的 手拿书本 临近期末考试 我知道你很焦急 怕这次排名下降 拿不到奖学金 你一直在...
    我是马小跳呀阅读 818评论 0 1
  • 你们在每天写的三件事当中,最困难最痛苦的那件事,你是会优先做呢,还是会放到后面去做? 我想大部分人的第一反应是,每...
    知足_946b阅读 3,294评论 0 0
  • 放暑假对于我这个学生来讲,是快乐的,也是惆怅的也是忧虑的! 放假的每一天都在放纵自己,日复一日的懒惰下去,直到今天...
    先生的秘书阅读 2,586评论 4 1