• CCF-CSP题解 201803-3 URL映射


    题目要求写一个简易的URL规则和URL地址匹配的程序。

    说说我的思路。

    将URL规则和地址都截成片段用结构体(<type, str[]>)存储。对于URL规则,(type)为0代表(/),1代表(<str>),2代表(<int>),3代表(<path>),4代表两个(/)之间的字符串(用(str[])存储)。对于URL地址,(type)为0代表(/),1代表两个(/)之间的字符串(用(str[])存储)。

    然后就是一些字符串处理,模拟着匹配一下。不同(type)的节点匹配起来有些不同。

    注意(<int>)匹配后输出,要去掉前导零。

    #include <bits/stdc++.h>
    const int maxn = 100;
    const int maxm = 100;
    
    using namespace std;
    
    struct tNode
    {
        int type;
        char str[105];
    };
    tNode rule[maxn+5][55];
    int ruleCnt[maxn+5];
    
    char name[maxn+5][105];
    
    tNode url[55];
    int urlCnt;
    
    bool isNumber(char s[])
    {
        for (int i = 0; s[i] != ''; i++)
        {
            if (s[i] < '0' || s[i] > '9')
                return false;
        }
        return true;
    }
    
    int main()
    {
        int n, m;
        scanf("%d%d", &n, &m);
    
        memset(ruleCnt, 0, sizeof(ruleCnt));
        for (int i = 1; i <= n; i++)
        {
            char p[105], r[105];
            scanf("%s%s", p, r);
            int &cnt = ruleCnt[i];
            for (int j = 0; p[j] != ''; )
            {
                if (p[j] == '/')
                {
                    rule[i][++cnt].type = 0;
                    j++;
                }
                else if (p[j] == '<')
                {
                    if (p[j+1] == 's')
                    {
                        rule[i][++cnt].type = 1;
                        j += 5;
                    }
                    else if (p[j+1] == 'i')
                    {
                        rule[i][++cnt].type = 2;
                        j += 5;
                    }
                    else
                    {
                        rule[i][++cnt].type = 3;
                        j += 6;
                    }
                }
                else
                {
                    rule[i][++cnt].type = 4;
                    int k = 0;
                    for (; p[j] != '/' && p[j] != ''; j++)
                    {
                        rule[i][cnt].str[k++] = p[j];
                    }
                    rule[i][cnt].str[k] = '';
                }
            }
            strcpy(name[i], r);
        }
    
        while (m--)
        {
            char q[105];
            scanf("%s", q);
            urlCnt = 0;
            int &cnt = urlCnt;
            for (int i = 0; q[i] != ''; )
            {
                if (q[i] == '/')
                {
                    url[++cnt].type = 0;
                    i++;
                }
                else
                {
                    url[++cnt].type = 1;
                    int k = 0;
                    for (; q[i] != '/' && q[i] != ''; i++)
                    {
                        url[cnt].str[k++] = q[i];
                    }
                    url[cnt].str[k] = '';
                }
            }
            bool fflag = false;
            for (int i = 1; i <= n; i++)
            {
                bool flag = true;
                int ansPath = 0;
                if (ruleCnt[i] > urlCnt)
                    flag = false;
                if (ruleCnt[i] < urlCnt && rule[i][ruleCnt[i]].type != 3)
                    flag = false;
                for (int j = 1; j <= ruleCnt[i] && flag; j++)
                {
                    if (rule[i][j].type == 0)
                    {
                        if (url[j].type != 0)
                            flag = false;
                    }
                    else if (rule[i][j].type == 1)
                    {
                        if (url[j].type != 1)
                            flag = false;
                    }
                    else if (rule[i][j].type == 2)
                    {
                        if (url[j].type != 1 || !isNumber(url[j].str))
                            flag = false;
                    }
                    else if (rule[i][j].type == 3)
                    {
                        ansPath = j;
                    }
                    else
                    {
                        if (strcmp(rule[i][j].str, url[j].str) != 0)
                            flag = false;
                    }
                }
                if (flag)
                {
                    fflag = true;
                    printf("%s", name[i]);
                    for (int j = 1; j <= ruleCnt[i]; j++)
                    {
                        if (rule[i][j].type == 1)
                            printf(" %s", url[j].str);
                        else if (rule[i][j].type == 2)
                        {
                            int k = 0;
                            for (; url[j].str[k] == '0'; k++);
                            if (url[j].str[k] == '')
                                printf(" 0");
                            else
                                printf(" %s", url[j].str + k);
                        }
                        else if (rule[i][j].type == 3)
                        {
                            printf(" ");
                            for (int k = ansPath; k <= urlCnt; k++)
                            {
                                if (url[k].type == 0)
                                    printf("/");
                                else if (url[k].type == 1)
                                    printf("%s", url[k].str);
                            }
                        }
                    }
                    printf("
    ");
                    break;
                }
            }
            if (!fflag)
                printf("404
    ");
        }
    
        return 0;
    }
    
  • 相关阅读:
    11-Mybatis中使用PageHelper分页插件
    10-Mybatis使用注解开发
    Windows快捷键
    环境搭建
    计算机基础
    oracle语句
    oracle
    测试质量和类型
    测试基础
    项目部署和总结
  • 原文地址:https://www.cnblogs.com/acboyty/p/11363143.html
Copyright © 2020-2023  润新知