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] != '\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映射的更多相关文章
- CCF CSP 201803-3 URL映射
转载自 https://blog.csdn.net/tigerisland45/article/details/81697594 /* CCF201803-3 URL映射 */ #include &l ...
- CCF 201803-3 URL映射
CCF 201803-3 URL映射 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django. ...
- url映射 ccf (Java正则表达式80分解法)
问题描述 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django.Ruby on Rails 等 ...
- CCF(URL映射:80分):字符串处理+模拟
URL映射 CCF201803-3 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- CCF CSP 201612-3 权限查询
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-3 权限查询 问题描述 授权 (authorization) 是各类业务系统不可缺 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- CCF CSP 201312-3 最大的矩形
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...
- CCF CSP 201609-3 炉石传说
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...
- CCF CSP 201403-3 命令行选项
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
随机推荐
- Redux第一节
安装脚手架 npm i -g create-react-app 创建一个Dom create-react-app demo01 安装 Ant Design npm i antd --save 安装re ...
- 如何在maven中下载jar包
1.进入maven网址 https://mvnrepository.com/ 2.搜索你想要的包的名字 3.找到列表中你想要的包 4.点击一个版本 5.点击 view all 6.找到你想要的包,点 ...
- 20191114-2 Beta事后诸葛亮会议
此作业要求:http://edu.cnblogs.com/campus/nenu/2019fall/homework/10005 组名:扛把子 组长:孙晓宇 组员:宋晓丽.梁梦瑶.韩昊.刘信鹏 扛把子 ...
- 新闻实时分析系统-inux环境准备与设置
1.Linux系统常规设置 1)设置ip地址 项目视频里面直接使用界面修改ip比较方便,如果Linux没有安装操作界面,需要使用命令:vi /etc/sysconfig/network-scripts ...
- 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)
花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...
- 设计模式之观察者模式--PHP
列举一个场景:下班之后回家,打开家门,开始做饭,之后睡觉 以上场景如果按照传统的开始方式就是封装一个用户类,里面有回家方法,打开门方法,做饭方法,睡觉方法,之后在外面依次调用. 假设你代码开发完了,这 ...
- PAT甲级专题|树的遍历
PAT甲级专题-树的遍历 涉及知识点:树.建树.深度优先搜索.广度优先搜索.递归 甲级PTA 1004 输出每一层的结点,邻接表vector建树后.用dfs.bfs都可以边搜边存当前层的数据, #in ...
- 2019-2020-1 20199304《Linux内核原理与分析》第二周作业
计算机工作原理 存储程序计算机模型 冯·诺依曼体系结构 冯·诺依曼体系结构如图所示: 冯·诺依曼体系结构包含五大部分 运算器:在控制器的统一控制下,负责对数据进行加工.完成各种运算,如算术运算.逻辑运 ...
- 比特宇宙-TCP/IP的诞生
前情回顾: 我是一个explorer的线程 我是一个杀毒软件线程 我是一个IE浏览器线程 比特宇宙创世不久,宇宙中开始出现文明. 文明不断碰撞.融合.进化,逐渐分化为几大派系: 施行Unix体制的帝国 ...
- ssm三大框架整合基本配置
ssm三大框架整合基本配置 maven目录结构 数据库脚本mysql create database maven; use maven ; -- --------------------------- ...