题目要求写一个简易的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] != '\0'; 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] != '\0'; )
{
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] != '\0'; j++)
{
rule[i][cnt].str[k++] = p[j];
}
rule[i][cnt].str[k] = '\0';
}
}
strcpy(name[i], r);
} while (m--)
{
char q[105];
scanf("%s", q);
urlCnt = 0;
int &cnt = urlCnt;
for (int i = 0; q[i] != '\0'; )
{
if (q[i] == '/')
{
url[++cnt].type = 0;
i++;
}
else
{
url[++cnt].type = 1;
int k = 0;
for (; q[i] != '/' && q[i] != '\0'; i++)
{
url[cnt].str[k++] = q[i];
}
url[cnt].str[k] = '\0';
}
}
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] == '\0')
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("\n");
break;
}
}
if (!fflag)
printf("404\n");
} return 0;
}

CCF-CSP题解 201803-3 URL映射的更多相关文章

  1. CCF CSP 201803-3 URL映射

    转载自 https://blog.csdn.net/tigerisland45/article/details/81697594 /* CCF201803-3 URL映射 */ #include &l ...

  2. CCF 201803-3 URL映射

    CCF 201803-3  URL映射 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django. ...

  3. url映射 ccf (Java正则表达式80分解法)

    问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...

  4. CCF(URL映射:80分):字符串处理+模拟

    URL映射 CCF201803-3 #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  5. CCF CSP 201612-3 权限查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-3 权限查询 问题描述 授权 (authorization) 是各类业务系统不可缺 ...

  6. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  7. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  8. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  9. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  10. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

随机推荐

  1. Future模式的学习以及JDK内置Future模式的源码分析

    并发程序设计之Future模式 一).使用Future模式的原因 当某一段程序提交了一个请求,期待得到一个答复,但服务程序对这个请求的处理可能很慢,在单线程的环境中,调用函数是同步的,必须等到服务程序 ...

  2. python--debug神器pysnooper

    使用它你可以获得什么优势: (1)无需用print就可以获得变量的值: (2)以日志地形式进行保存,方便随时查看: (3)可以根据需要,设置调用函数的深度: (4)多个函数的日志,可以设置前缀进行标识 ...

  3. k8s Ingress 理解和部署

    目录 前言 Ingress 与 ingress-controller Ingress 部署 1.部署 ingress-controller 2.部署测试 web 服务 3.部署 Ingress 4.检 ...

  4. php基础文档

    目录 PHP简介 PHP概述和名词解释 PHP常见数据类型 PHP运算符 PHP流程控制语句 PHP函数 PHP类与对象 PHP会话session与缓存cookie(扩展) 1.PHP简介 PHP,即 ...

  5. 是谁,在敲打我窗-CSS雨滴动画效果

    1.扯闲篇 是谁在敲打我窗  是谁在撩动琴弦  那一段被遗忘的时光 渐渐地回升出我心坎  是谁在敲打我窗  是谁在撩动琴弦 记忆中那欢乐的情景  慢慢地浮现在我的脑海 那缓缓飘落的小雨  不停地打在我 ...

  6. Caused by: java.util.zip.ZipException: zip file is empty

    1.问题描述:mybranch分支代码和master分支的代码一模一样,mybranch代码部署到服务器上没有任何问题,而master代码部署到服务器上运行不起来. 2.解决办法: (1)登陆服务器启 ...

  7. 【数据结构】之队列(C语言描述)

    队列(Queue)是编程中最常用的数据结构之一. 队列的特点是“先进先出”,就像食堂排队买饭一样,先来的人排在前面,后来的人排在后面:前面的人先买饭,买完饭后离开这个队列.这就是队列的原理,它可以进行 ...

  8. Django中间件部分源码分析

    中间件源码分析 中间件简介 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定的 ...

  9. Sublime Text 3 免费注册方法(福利)

    对于使用Sublime Text但是又不愿花钱注册的小伙伴,福利到了,免费注册一下你的Sublime吧. 版本3207: 打开Sublime text,然后点击菜单Help->Enter Lis ...

  10. phpStorm自动生成___jb_tmp___文件

    把这个去掉就可以了