CCF201803-3,URL映射

没什么难度,主要还是如何很好的把字符串处理成结构体

逻辑处理的时候,先分为两类,一类是有path的,一类是没有path的,没有path的先通过匹配项数过滤掉一部分,然后逐项匹配,其中int是判断是否是数字,str直接通过;判断path的时候,从当前项到最后全部都是。

匹配到的特殊项加入vector,最后统一输入,path匹配的需要把相应的项用字符串连接到一起

然后如果结尾有斜杠的话特殊需要特殊处理一下。

这个题做起来还蛮顺的,处理字符串处理好了是真的方便。不过因为题目没说会用到多长的字符串,所以构建的char数组大了一些,内存消耗有点大。

PS:我试着调小了一些数组大小,能通过,但是耗时不是0ms了是什么鬼?减少了数组大小会增加耗时?有懂的吗?

这个题我还想构建树结构,后来觉得太麻烦了,结果不用树结构一一匹配也能完成。。。

#include<bits/stdc++.h>
using namespace std;

struct match{
    string c;
    int type;//0 == string,2==str,1==int,3==path,4==slash,5==name
    bool init;
    bool knum;
    int num = -1;
    bool isnum(){
        if(init){
            return knum;
        }else{
            for(int i = 0;i<c.size();i++)
            {
                if(c[i] >= '0' && c[i]<='9'){

                }else{
                    knum = false;
                    init = true;
                    return knum;
                }
            }
            init = true;
            knum = true;
            sscanf(c.data(),"%d",&num);
            char tmp[80];
            sprintf(tmp,"%d",num);
            c = tmp;

            return knum;
        }
    }
};
struct url{
    match surl[100];
    int number;
    bool slash;
    bool mpath;
    string name;
    
    void initial(char *s){
        number = 0;
        slash = false;
        mpath = false;

        char url[2500],_name[2500];
        sscanf(s,"%s%*c%[^\n]",url,_name);
        name = _name;

        char sub[80];

        int size = strlen(url);
        int iter;

        for(int i = 0;i<size-1;)
        {
            sscanf(url+i,"%*c%[^/]%n",sub,&iter);
            i+=iter;

            match tmp;
            tmp.c = sub;
            tmp.type = judgetype(tmp.c);
            if(tmp.type == 3){
                mpath = true;
            }
            surl[number++]=tmp;
        }
        if(url[size-1]=='/'){
            slash = true;
        }
    }

    int judgetype(string &s)
    {
        if(s[0]!='<'){
            return 0;
        }else{
            if(s.find("str")!=-1){
                return 2;
            }
            if(s.find("int")!=-1){
                return 1;
            }
            if(s.find("path")!=-1){
                return 3;
            }
        }
        return -1;
    }

};

bool match(url &rule,url &u){
    vector<string> mstr;

    if(rule.mpath)
    {
        for(int i = 0;i<rule.number;i++)
        {
            int rtype = rule.surl[i].type;
            if(rtype == 0){
                if(rule.surl[i].c != u.surl[i].c)
                {
                    return false;
                }
            }else if(rtype == 1){
                if(!u.surl[i].isnum()){
                    return false;
                }
                mstr.push_back(u.surl[i].c);
            }else if(rtype == 2){
                mstr.push_back(u.surl[i].c);
                continue;
            }else if(rtype == 3){
                string s = "";
                for(int j = i;j<u.number;j++)
                {
                    s+=u.surl[j].c;
                    if(j <u.number-1)
                    {
                        s+="/";
                    }
                }
                if(u.slash){
                    s+="/";
                }
                mstr.push_back(s);
            }
        }

        printf("%s ",rule.name.data());
        for(int i = 0;i<mstr.size();i++)
        {
            printf("%s ",mstr[i].data());
        }
        printf("\n");
        return true;
    }else{
        if(rule.number != u.number){
            return false;
        }else if(rule.slash != u.slash){
            return false;
        }

        for(int i = 0;i<rule.number;i++)
        {
            int rtype = rule.surl[i].type;
            if(rtype == 0){
                if(rule.surl[i].c != u.surl[i].c)
                {
                    return false;
                }
            }else if(rtype == 1){
                if(!u.surl[i].isnum()){
                    return false;
                }
                mstr.push_back(u.surl[i].c);
            }else if(rtype == 2){
                mstr.push_back(u.surl[i].c);
                continue;
            }else if(rtype == 3){//不可能出现这种情况

            }
        }

        printf("%s ",rule.name.data());
        for(int i = 0;i<mstr.size();i++)
        {
            printf("%s ",mstr[i].data());
        }
        printf("\n");
        return true;
    }
}

int main() {
    int n,m;
    scanf("%d%d%*c",&n,&m);

    url u[100],ma;
    
    char line[5000];
    for(int i = 0;i<n;i++)
    {
        fgets(line,5000,stdin);
        u[i].initial(line);
    }

    for(int i = 0;i<m;i++)
    {
        fgets(line,5000,stdin);
        ma.initial(line);
        bool succ = false;
        for(int j = 0;j<n;j++)
        {
            bool res = match(u[j],ma);
            if(res){
                succ = true;
                break;
            }
        }
        if(!succ)
        {
            printf("404\n");
        }
    }


    return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值