ccf元素选择器(STL+BFS)

本文介绍了一段复杂的C++代码,该代码用于解析文本并实现特定的搜索算法。通过对输入的文本进行预处理,代码能够根据指定的查询条件在已解析的数据中查找匹配项。文章详细解释了代码结构,包括使用正则表达式进行文本处理、定义结构体存储数据、以及通过深度优先搜索算法来解决查询问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<regex,string>>trans={
      {regex ("(\\.)([a-zA-Z0-9])"),"$1 $2"}
};
struct po{
	string lable;
	string id="";
	int l;
	po(string x,string y,int xx){
		lable=x;
		id=y;
		l=xx;
	}
};
struct poo{
	string lable;
	string id="";
	poo(string x,string y){
		lable=x;
		id=y;
	}
};
int flag=0;
vector<po>ve;
vector<string>intemp;
vector<int>ans;
vector<poo>query;
string tolow(string x){//转化为小写 	
	for(int i=0;i<x.size();i++)x[i]=tolower(x[i]);
	return x;
}
void tostr(string line,string ch){//以ch分割字符串 
	int t;
	intemp.clear(); 
    for(t = line.find(ch); t != string::npos; t = line.find(ch))
    {
        intemp.push_back(line.substr(0,t));
        line = line.substr(t+1);
    }
    intemp.push_back(line);
    return;
}
bool judge(string x1,string y1,string x2,string y2){
	if(x2==""&&y2==y1)return true;
	if(y2==""&&x1==x2)return true;
	return false;
}
void dfs(int ll,int num,int level){
	if(num==query.size()){
		flag=1;
		return;
	}
	int ed=query.size();
	for(int i=ll-1;i>=1;i--){
		if(ve[i].l>=level)continue;
		if(judge(ve[i].lable,ve[i].id,query[ed-num-1].lable,query[ed-num-1].id)){
			dfs(i,num+1,ve[i].l);
			if(flag)return;
		}
	}
}
int n,m;
int main(){
	cin>>n>>m;
	ve.push_back(po("","",0));
	getchar();
	for(int i=1;i<=n;i++){
		string ip;
		getline(cin,ip);
		for(auto it:trans){
			ip=regex_replace(ip,it.first,it.second);
		}
		tostr(ip," ");
		int num=0;
		
		for(int z=0;z<intemp.size();z++){
			if(intemp[z][0]=='.'){
				num=intemp[z].size();
				continue; 
			}
			if(intemp[z][0]=='#'){
				ve[i].id=intemp[z];
		        continue;
			}
			string temp=tolow(intemp[z]);
			ve.push_back(po(temp,"",num));
		}
	}
	while(m--){
		string q;
		getline(cin,q);
		tostr(q," ");
		ans.clear();
		query.clear();
		for(int z=0;z<intemp.size();z++){
		        string temp=intemp[z];
				if(temp[0]=='#'){
		            query.push_back(poo("",temp));
				}else{
				   tolow(temp);
				   query.push_back(poo(temp,""));	
				} 	
		}
		int ed=query.size()-1;
		for(int i=1;i<=n;i++){
			flag=0;
			if(judge(ve[i].lable,ve[i].id,query[ed].lable,query[ed].id)){
				dfs(i,1,ve[i].l);
				if(flag){
		             ans.push_back(i);
				  }
			}
		}
	if(ans.empty()){
		cout<<0<<endl;
		continue;
	}else{
		cout<<ans.size();
		for(auto k:ans){
			cout<<" "<<k;
		}
		cout<<endl;
	}
	}
	return 0;
}
/*
11 10
html
..head
....title
..body
....h1
....p #subtitle
....div #main
......h2
......p #one
......div
........p #two
p
#subtitle
h3
div p
div div p
*/

 

说明:只得了90分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值