CCF URL映射(大模拟)

本文深入探讨了CCF(中国计算机学会)URL映射的实现原理,通过大模拟的方式,详细解释了URL到内部资源的转化过程,包括请求路由、参数解析、权限验证等关键步骤,旨在帮助读者理解复杂系统中的URL管理和调度机制。
摘要由CSDN通过智能技术生成
#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;
struct Node{
    vector<string> v;
    string name;
}a[105];
vector<string> org;
int n,m;
int judge(string t) {
    bool flag = true;
    for(int i = 0; i < t.length(); ++i) {
        if(t[i] <'0' || t[i] >'9')
            flag = false;
    }
    if(flag) return 1;
    flag = true;
    for(int i = 0; i < t.length(); ++i) {
        if(!(t[i] == '_' || t[i] == '.' || t[i] == '-' || t[i] >= 'a' && t[i] <='z' || t[i] >= 'A' && t[i] <= 'Z' || t[i] >= '0' && t[i] <= '9'))
            flag = false;
    }
    if(flag) return 2;
    flag = true;
    for(int i = 0; i < t.length(); ++i) {
        if(!(t[i] == '_' || t[i] == '.' || t[i] == '-' || t[i] >= 'a' && t[i] <='z' || t[i] >= 'A' && t[i] <= 'Z' || t[i] >= '0' && t[i] <= '9' || t[i] == '/'))
            flag = false;
    }    
    if(flag)
        return 3;
}
int main() {
    scanf("%d%d", &n, &m);
    string s1,s2;
    for(int i = 0; i < n; ++i) {
        cin >> s1 >> s2;
        int pre = 1;
        org.push_back(s1);
        for(int k = 0; k < s1.length(); ++k) {
            if(k && s1[k] =='/') {
                a[i].v.push_back(s1.substr(pre,k-pre));
                pre = k+1;
            }
        }
        if(s1[s1.length()-1] != '/') 
            a[i].v.push_back(s1.substr(pre));
        else 
            a[i].v.push_back("/");
        a[i].name = s2;
    }
    vector<string> v;
    for(int i = 0; i < m; ++i) {
        cin >> s1;

        bool fg = true;
        for(int p = 0; p < s1.length(); ++p) {
            if(!(s1[i] == '_' || s1[i] == '.' || s1[i] == '-' || s1[i] >= 'a' && s1[i] <='z' || s1[i] >= 'A'
             && s1[i] <= 'Z' || s1[i] >= '0' && s1[i] <= '9' || s1[i] == '/')) {
                fg = false;
                break;
            }
        }
        if(!fg) {
            cout <<"404" << endl;
            continue;
        }
        v.clear();
        int pre = 1;
        for(int k = 0; k < s1.length(); ++k) {
            if(k && s1[k] =='/') {
                v.push_back(s1.substr(pre,k-pre));
                pre = k+1;
            }
        }
        if(s1[s1.length()-1] != '/') 
            v.push_back(s1.substr(pre));
        else v.push_back("/");
        bool match = false;
        vector<string> ans;
        for(int j = 0; j < n; ++j) {
            int k = 0;
            ans.clear();
            if(a[j].v.size() == v.size()){
                for(; k < v.size(); ++k) {
                    if(v[k] == a[j].v[k])
                        continue;
                    if(a[j].v[k] != "<int>" && a[j].v[k] != "<path>" && a[j].v[k] != "<str>")
                        break;

                    int cat = judge(v[k]);
                    if(cat == 1 && a[j].v[k] == "<int>" || cat == 2 && a[j].v[k] == "<str>" || cat == 3 && a[j].v[k] == "<path>") {
                        int p = 0;
                        if(cat == 1) {
                            for(; p < v[k].length() && v[k][p] == '0'; ++p);
                            // cout << p << endl;
                        }
                        string tt = v[k].substr(p);
                        ans.push_back(tt);
                        continue;
                    }
                    else break;
                }


                if(k == v.size()) {
                    cout << a[j].name ;
                    for(int p = 0; p < ans.size(); ++p)
                        cout <<" "<< ans[p];
                    puts("");
                    match = true;
                    break;
                }
            }
            int pos = org[j].find("<path>");
            if(pos != -1) {
                bool f = true;
                int p = 0;
                for(; p < pos && p < s1.size(); ++p) {
                    if(org[j][p] != s1[p]) {
                        f = false;
                        break;
                    }
                }
                if(p < s1.size() && f) {
                    ans.push_back(s1.substr(p));
                    match = true;
                    cout << a[j].name;
                    for(int p = 0; p < ans.size(); ++p)
                        cout <<" "<< ans[p];
                    puts("");                            
                }
            }            
            if(match)
                break;
        }
        if(!match)
            cout <<"404" << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值