201612-3 权限查询

这个C++程序定义了两个映射`role`和`user`,分别存储角色和用户的字符串关联字符串列表。它包含`judge`和`process1`函数来比较字符串并找出最佳匹配。主函数读取输入的p个角色,r组角色的子字符串,u个用户及其子字符串,然后对于q个查询,调用`process`函数找到最佳匹配,并输出结果。程序涉及字符串处理和映射操作。

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

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int p,r,u,num,q,mx=-1,mxx;
map<string,vector<string>>role,user;
map<string,int>recond;
int judge(string s,string s1)
{
    auto it=s.find(":"),its=s1.find(":");
    if(it==s.npos&&its==s1.npos)return -1;
    if(it==s.npos&&its!=s1.npos)return -1;
    string ts=s.substr(0,it),ts1=s1.substr(0,its);
    if(ts!=ts1) return -1;
    if(it!=s.npos&&its==s1.npos)
        return stoi(s.substr(it+1));
    string num=s.substr(it+1),num1=s1.substr(it+1);
    if(stoi(num)>=stoi(num1)) return -2;
    else return -1;
}
int process1(string s,string s1)
{
    if(role.find(s)==role.end()) return -1;
    vector<string> t=role[s];
    for(int j=0;j<t.size();j++)
        {
            int q=judge(t[j],s1);
            if(q>=0)
                mx=max(mx,q);
            if(q==-2||t[j]==s1)
                return -2;
        }
    if(mx!=-1)
        return mx;
    return -1;
}
int process(string s,string s1)
{
    bool f=0;
    if(user.find(s)==user.end()) return -1;
    vector<string> t=user[s];
    for(int j=0;j<t.size();j++)
        {
            int d=process1(t[j],s1);
            if(d==-2)
                return d;
            if(d>=0)
                mxx=max(d,mxx);
        }
    if(mxx!=-1)
        return mxx;
    return -1;
}
int main()
{
    string s,s1;
    cin>>p;
    for(int i=0;i<p;i++)
        cin>>s;
    cin>>r;
    for(int i=0;i<r;i++)
    {
        cin>>s>>num;
        for(int j=0;j<num;j++)
        {
            cin>>s1;
            role[s].push_back(s1);
        }
    }
    cin>>u;
    for(int i=0;i<u;i++)
    {
        cin>>s>>num;
        for(int j=0;j<num;j++)
        {
            cin>>s1;
            user[s].push_back(s1);
        }
    }
    cin>>q;
    for(int i=0;i<q;i++)
    {
        mx=-1;
        mxx=-1;
        cin>>s>>s1;
        int d=process(s,s1);
        if(d==-2)
            cout<<"true"<<endl;
        else if(d>=0)
            cout<<d<<endl;
        else cout<<"false"<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值