ccf 201809-3 元素选择器 Java

一、题目

问题描述

试题编号:201809-3
试题名称:元素选择器
时间限制:1.0s
内存限制:256.0MB
问题描述:




二、思路

待更新

三、代码

只有70分

import java.util.*;
public class Main{
	 static class node{
		int isId=0;
		int sub;
		String p;
		String id=null;
		node(int a,int b,String p,String id){
			isId=a;
			sub=b;
			this.p=p;
			this.id=id;
		}
	}
	static node[] doc;
	static String[] ans;
	static ArrayList<Integer>[] list;
	static int docnum;
	public static void main(String[] args){
		Scanner in=new Scanner(System.in);
		docnum=in.nextInt();
		int ansnum=in.nextInt();
		String[] str=new String[docnum];
		in.nextLine();
		doc=new node[docnum];
		ans=new String[ansnum];
		list=new ArrayList[ansnum];
		for(int i=0;i<docnum;i++){
			str[i]=in.nextLine();
		}
		for(int i=0;i<ansnum;i++){
			ans[i]=in.nextLine();
		}
		for(int i=0;i<ansnum;i++)
			list[i]=new ArrayList();
		solve(str);
		result(ansnum,docnum);
		for(int i=0;i<ansnum;i++){
			if(list[i].size()==0)
				System.out.println(0);
			else{
				System.out.print(list[i].size());
				for(int k=0;k<list[i].size();k++)
					System.out.print(" "+list[i].get(k));
				System.out.println();
			}
		}
		
	}
	static void result(int ansnum,int docnum){
		
		for(int i=0;i<ansnum;i++){
			String[] split=ans[i].split("\\s+");
			if(split.length==1){
				if(split[0].charAt(0)=='#'){
					for(int k=0;k<docnum;k++){
						if(ans[i].equals(doc[k].id))
							list[i].add(k+1);
					}
				}else{
					String s=ans[i].toLowerCase();
					for(int k=0;k<docnum;k++){
						if(s.equals(doc[k].p))
							list[i].add(k+1);
					}
				}
				
				
			}else{
				if(split[0].charAt(0)=='#'){
    				for(int j=0;j<docnum;j++){
    					if(doc[j].id.equals(split[0])){
    						int loc=doc[j].sub;
    						int flag=1;
    						for(int k=j+1;k<docnum;k++){
    							String s1=split[flag].toLowerCase();
    							if(doc[k].id.equals(s1)&&(doc[k].sub>loc)){
    								flag++;
    								loc=doc[k].sub;
    							}
    							if(flag==split.length){
    								list[i].add(k+1);
    								break;
    							}
    								
    						}
    					}
    				}
				}
				else{
					for(int j=0;j<docnum;j++){
    					if(doc[j].p.equals(split[0])){
    						int loc=doc[j].sub;
    						int flag=1;
    						for(int k=j+1;k<docnum;k++){
    							String s1=split[flag].toLowerCase();
    							if(doc[k].p.equals(s1)&&(doc[k].sub>loc)){
    								flag++;
    								loc=doc[k].sub;
    							}
    							if(flag==split.length){
    								list[i].add(k+1);
    								break;
    							}
    								
    						}
    					}
    				}
					
				}
			}
		}
	}
	static void solve(String[] str){
		int len=str.length;
		String tree=str[0].toLowerCase();
		doc[0]=new node(0,0,tree,null);
		for(int i=1;i<len;i++){
			StringBuffer buf=new StringBuffer();
			int temp=0;
			char ch='.';
			int a=0,b=0;
			String s=null;
			String id=null;
			for(temp=0;;temp+=2){
				ch=str[i].charAt(temp);
				if(ch!='.'){
					b=temp/2;
					break;
				}
			}
			for(;;temp++){
				if(temp==str[i].length())
					break;
				
				ch=str[i].charAt(temp);
				if(ch==' '){
					break;
				}
				buf.append(ch);
			}
			s=buf.toString().toLowerCase();
			if(temp<str[i].length()){
				String[] split=str[i].split("\\s+");
				id=split[1];
				a=1;
			}
			doc[i]=new node(a,b,s,id);
			
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值