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

说说我的思路。

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

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

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

  1. #include <bits/stdc++.h>
  2. const int maxn = 100;
  3. const int maxm = 100;
  4. using namespace std;
  5. struct tNode
  6. {
  7. int type;
  8. char str[105];
  9. };
  10. tNode rule[maxn+5][55];
  11. int ruleCnt[maxn+5];
  12. char name[maxn+5][105];
  13. tNode url[55];
  14. int urlCnt;
  15. bool isNumber(char s[])
  16. {
  17. for (int i = 0; s[i] != '\0'; i++)
  18. {
  19. if (s[i] < '0' || s[i] > '9')
  20. return false;
  21. }
  22. return true;
  23. }
  24. int main()
  25. {
  26. int n, m;
  27. scanf("%d%d", &n, &m);
  28. memset(ruleCnt, 0, sizeof(ruleCnt));
  29. for (int i = 1; i <= n; i++)
  30. {
  31. char p[105], r[105];
  32. scanf("%s%s", p, r);
  33. int &cnt = ruleCnt[i];
  34. for (int j = 0; p[j] != '\0'; )
  35. {
  36. if (p[j] == '/')
  37. {
  38. rule[i][++cnt].type = 0;
  39. j++;
  40. }
  41. else if (p[j] == '<')
  42. {
  43. if (p[j+1] == 's')
  44. {
  45. rule[i][++cnt].type = 1;
  46. j += 5;
  47. }
  48. else if (p[j+1] == 'i')
  49. {
  50. rule[i][++cnt].type = 2;
  51. j += 5;
  52. }
  53. else
  54. {
  55. rule[i][++cnt].type = 3;
  56. j += 6;
  57. }
  58. }
  59. else
  60. {
  61. rule[i][++cnt].type = 4;
  62. int k = 0;
  63. for (; p[j] != '/' && p[j] != '\0'; j++)
  64. {
  65. rule[i][cnt].str[k++] = p[j];
  66. }
  67. rule[i][cnt].str[k] = '\0';
  68. }
  69. }
  70. strcpy(name[i], r);
  71. }
  72. while (m--)
  73. {
  74. char q[105];
  75. scanf("%s", q);
  76. urlCnt = 0;
  77. int &cnt = urlCnt;
  78. for (int i = 0; q[i] != '\0'; )
  79. {
  80. if (q[i] == '/')
  81. {
  82. url[++cnt].type = 0;
  83. i++;
  84. }
  85. else
  86. {
  87. url[++cnt].type = 1;
  88. int k = 0;
  89. for (; q[i] != '/' && q[i] != '\0'; i++)
  90. {
  91. url[cnt].str[k++] = q[i];
  92. }
  93. url[cnt].str[k] = '\0';
  94. }
  95. }
  96. bool fflag = false;
  97. for (int i = 1; i <= n; i++)
  98. {
  99. bool flag = true;
  100. int ansPath = 0;
  101. if (ruleCnt[i] > urlCnt)
  102. flag = false;
  103. if (ruleCnt[i] < urlCnt && rule[i][ruleCnt[i]].type != 3)
  104. flag = false;
  105. for (int j = 1; j <= ruleCnt[i] && flag; j++)
  106. {
  107. if (rule[i][j].type == 0)
  108. {
  109. if (url[j].type != 0)
  110. flag = false;
  111. }
  112. else if (rule[i][j].type == 1)
  113. {
  114. if (url[j].type != 1)
  115. flag = false;
  116. }
  117. else if (rule[i][j].type == 2)
  118. {
  119. if (url[j].type != 1 || !isNumber(url[j].str))
  120. flag = false;
  121. }
  122. else if (rule[i][j].type == 3)
  123. {
  124. ansPath = j;
  125. }
  126. else
  127. {
  128. if (strcmp(rule[i][j].str, url[j].str) != 0)
  129. flag = false;
  130. }
  131. }
  132. if (flag)
  133. {
  134. fflag = true;
  135. printf("%s", name[i]);
  136. for (int j = 1; j <= ruleCnt[i]; j++)
  137. {
  138. if (rule[i][j].type == 1)
  139. printf(" %s", url[j].str);
  140. else if (rule[i][j].type == 2)
  141. {
  142. int k = 0;
  143. for (; url[j].str[k] == '0'; k++);
  144. if (url[j].str[k] == '\0')
  145. printf(" 0");
  146. else
  147. printf(" %s", url[j].str + k);
  148. }
  149. else if (rule[i][j].type == 3)
  150. {
  151. printf(" ");
  152. for (int k = ansPath; k <= urlCnt; k++)
  153. {
  154. if (url[k].type == 0)
  155. printf("/");
  156. else if (url[k].type == 1)
  157. printf("%s", url[k].str);
  158. }
  159. }
  160. }
  161. printf("\n");
  162. break;
  163. }
  164. }
  165. if (!fflag)
  166. printf("404\n");
  167. }
  168. return 0;
  169. }

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. .NET core3.0 使用Jwt保护api

    摘要: 本文演示如何向有效用户提供jwt,以及如何在webapi中使用该token通过JwtBearerMiddleware中间件对用户进行身份认证. 认证和授权区别? 首先我们要弄清楚认证(Auth ...

  2. 基于Galera Cluster多主结构的Mysql高可用集群

    Galera Cluster特点 1.多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的 2.同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失 3.并发复制:从 ...

  3. 性能测试:深入理解线程数,并发量,TPS,看这一篇就够了

    并发数,线程数,吞吐量,每秒事务数(TPS)都是性能测试领域非常关键的数据和指标. 那么他们之间究竟是怎样的一个对应关系和内在联系? 测试时,我们经常容易将线程数等同于表述为并发数,这一表述正确吗? ...

  4. pdf 在线预览之 pdfobject插件

    支持到ie9 可以不用安装  如果安装 npm i pdfobject 第一步:引入pdfObject包 申明一个变量 const { PDFObject } = require("../. ...

  5. 2019-9-20:渗透测试,基础学习,phpstudy搭建Wordpress,Burpsuite抓取WorePress cms的post包

    一.搭建WordPress的cms网站管理系统 1,下载Wordpress cms源码,下载地址:https://wordpress.org/download/ 2,将源码解压到phpstudy目录下 ...

  6. es3设置属性不能修改

    /*es3*/ { var Person =function () { var data ={ name:'zs', sex:'男', age:18 } this.get=function (key) ...

  7. Mac OS 终端利器 iTerm2(怕以后找不到,自存自用)

    之前一直使用 Mac OS 自带的终端,用起来虽然有些不太方便,但总体来说还是可以接受的,是有想换个终端的想法,然后今天偶然看到一个终端利器 iTerm2,发现真的很强大,也非常的好用,按照网上配置了 ...

  8. 数据降维-NMF非负矩阵分解

    1.什么是非负矩阵分解? NMF的基本思想可以简单描述为:对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得满足 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积 ...

  9. C#使用Consul集群进行服务注册与发现

    前言 我个人觉得,中间件的部署与使用是非常难记忆的:也就是说,如果两次使用中间件的时间间隔比较长,那基本上等于要重新学习使用. 所以,我觉得学习中间件的文章,越详细越好:因为,这对作者而言也是一份珍贵 ...

  10. mac 下面 vim 编辑器 开启语法高亮

    cp /usr/share/vim/vimrc ~/.vimrc 拷贝默认的配置文件 vim ~/.vimrc 编辑该文件 在文件的最后加入 syntax on 保存退出即可