CCF 权限查询

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1010;

int q,r,u,m;

map<string,int> qxmingdan;

map<string,vector<string> > usetojs;

map<string,vector<string> > jstoqx;

string qx;

struct js{
	string name;
	int counts;
	string qx[11];
}juese;

struct user{
	string name;
	int counts;
	string jsname[11];
}use;

string usename,quanxian;

int main(){
	int i,j;
	cin>>q;
	for(i=0;i<q;++i){
		cin>>qx;
		int len=qx.length();
		if(len<2){
			qxmingdan[qx]=10;
		}else{
			if(qx[len-2]==':'){
				qxmingdan[qx.substr(0,len-2)]=(qx[len-1]-'0');
			}else{
				qxmingdan[qx]=10;
			}
		}
	}
	cin>>r;
	for(i=0;i<r;++i){
		cin>>juese.name>>juese.counts;
		for(j=0;j<juese.counts;++j){
			cin>>juese.qx[j];
			jstoqx[juese.name].push_back(juese.qx[j]);
		}
	}
	cin>>u;
	for(i=0;i<u;++i){
		cin>>use.name>>use.counts;
		for(j=0;j<use.counts;++j){
			cin>>use.jsname[j];
			usetojs[use.name].push_back(use.jsname[j]);
		}
	}
	cin>>m;
	for(i=0;i<m;++i){
		cin>>usename>>quanxian;
		if(usetojs.count(usename)==0){
			puts("false");
			continue;
		}
		int len=quanxian.length();
		if(len<2){
			if(qxmingdan.count(quanxian)==0){
				puts("false");
				continue;
			}
		}else{
			if(quanxian[len-2]==':'){
				if(qxmingdan.count(quanxian.substr(0,len-2))==0){
					puts("false");
					continue;
				}
			}else{
				if(qxmingdan.count(quanxian)==0){
					puts("false");
					continue;
				}
			}
		}
		bool flag=false;
		int shu=0;
		int max=-1;
		vector<string> vec=usetojs[usename];
		for(j=0;j<vec.size();++j){
			vector<string> vec2=jstoqx[vec[j]];
			for(int k=0;k<vec2.size();++k){
				int l=vec2[k].length();
				if((len<2)||(quanxian[len-2]!=':')){
					int id=qxmingdan[quanxian];
					if(id==10){
						string a=vec2[k];
						if(a==quanxian){
							flag=true;
							puts("true");
							break;
						}
					}else{
						if(l<2) continue;
						string a=vec2[k].substr(0,l-2);
						int s=vec2[k][l-1]-'0';
						if(a==quanxian){
							if(max<s){
								max=s;
								shu=1;
								continue;
							}
						}
					}
				}else{
					if(l<2) continue;
					string a=vec2[k].substr(0,l-2);
					string b=quanxian.substr(0,len-2);
					if(a==b){
						if(vec2[k][l-1]>=quanxian[len-1]){
							flag=true;
							puts("true");
							break;
						}
					}
				}
			}
			if(flag) break;
		}
		if(flag) continue;
		if(shu){
			printf("%d\n",max);
			continue;
		}
		puts("false");
	}
	return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值