ccf 201803-3 URL映射

先看题:
问题描述
  URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。
  本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将请求中的 URL 地址按照配置的先后顺序逐一与这些规则进行匹配。当遇到第一条完全匹配的规则时,匹配成功,得到匹配的规则以及匹配的参数。若不能匹配任何一条规则,则匹配失败。
  本题输入的 URL 地址是以斜杠 / 作为分隔符的路径,保证以斜杠开头。其他合法字符还包括大小写英文字母、阿拉伯数字、减号 -、下划线 _ 和小数点 .。例如,/person/123/ 是一个合法的 URL 地址,而 /person/123? 则不合法(存在不合法的字符问号 ?)。另外,英文字母区分大小写,因此 /case/ 和 /CAse/ 是不同的 URL 地址。
  对于 URL 映射规则,同样是以斜杠开始。除了可以是正常的 URL 地址外,还可以包含参数,有以下 3 种:
  字符串 :用于匹配一段字符串,注意字符串里不能包含斜杠。例如,abcde0123。
  整数 :用于匹配一个不带符号的整数,全部由阿拉伯数字组成。例如,01234。
  路径 :用于匹配一段字符串,字符串可以包含斜杠。例如,abcd/0123/。
  以上 3 种参数都必须匹配非空的字符串。简便起见,题目规定规则中 和 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而 的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。
输入格式
  输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。
  第 2 行至第 n+1 行按匹配的先后顺序描述 URL 映射规则的配置信息。第 i+1 行包含两个字符串 pi 和 ri,其中 pi 表示 URL 匹配的规则,ri 表示这条 URL 匹配的名字。两个字符串都非空,且不包含空格字符,两者中间用一个空格字符分隔。
  第 n+2 行至第 n+m+1 行描述待处理的 URL 地址。第 n+1+i 行包含一个字符串 qi,表示待处理的 URL 地址,字符串中不包含空格字符。
输出格式
  输入共 m 行,第 i 行表示 qi 的匹配结果。如果匹配成功,设匹配了规则 pj ,则输出对应的 rj。同时,如果规则中有参数,则在同一行内依次输出匹配后的参数。注意整数参数输出时要把前导零去掉。相邻两项之间用一个空格字符分隔。如果匹配失败,则输出 404。
样例输入
5 4
/articles/2003/ special_case_2003
/articles// year_archive
/articles/// month_archive
/articles article_detail
/static/static_serve
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/static/js/jquery.js
样例输出
year_archive 2004
article_detail 1985 9 aloha
404
static_serve js/jquery.js
样例说明
  对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。
  对于第 2 个地址 /articles/1985/09/aloha/,只能匹配第 4 条规则,参数依次为 1985、9(已经去掉前导零)和 aloha。
  对于第 3 个地址 /articles/hello/,无法匹配任何一条规则。
  对于第 4 个地址 /static/js/jquery.js,可以匹配最后一条规则,参数为 js/jquery.js。
数据规模和约定
  1 ≤ n ≤ 100,1 ≤ m ≤ 100。
  所有输入行的长度不超过 100 个字符(不包含换行符)。
  保证输入的规则都是合法的。
  c++代码

#include<bits/stdc++.h>
using namespace std;
string quling(string s){//int型去前导0 string s1;int i;for(i=0;i<s.length();i++)  {if(s[i]!='0')break;}s1=s.substr(i,s.length()-i);return s1;
}
int isint(string s){//判断是字符串还是整形 int i=0;for(i=0;i<s.length();i++){if(!(s[i]>='0'&&s[i]<='9'))return 0;}if(i==s.length())return 1;
}
int main()
{int n,m;string rule[101];string rulename[101];string attm[101];vector<vector<string> > vvs;cin>>n>>m;getchar();for(int i=0;i<n;i++){//把url规则信息存入二维容器vvs vector<string> vs;cin>>rule[i]>>rulename[i];int pos=0;while(pos<rule[i].length()-1&&rule[i].find('/',pos+1)!=rule[i].npos){int pos1=rule[i].find('/',pos+1);string s = rule[i].substr(pos+1,pos1-pos-1);vs.push_back(s);pos=pos1;}if(pos!=rule[i].length()-1){vs.push_back(rule[i].substr(pos+1,rule[i].length()-pos-1));}else{vs.push_back("/");} vvs.push_back(vs);}getchar();for(int i=0;i<m;i++){//每个数据的查找 int find=0;getline(cin,attm[i]);vector<string> vs;int pos=0;while(pos<attm[i].length()-1&&attm[i].find('/',pos+1)!=attm[i].npos){//以/为界划分装vs容器 int pos1=attm[i].find('/',pos+1);string s = attm[i].substr(pos+1,pos1-pos-1);vs.push_back(s);pos=pos1;}if(pos!=attm[i].length()-1){//判断末尾是/吗,不判断只有60 vs.push_back(attm[i].substr(pos+1,attm[i].length()-pos-1));}else{ vs.push_back("/");}int j;for(j=0;j<vvs.size();j++){//对规则挨个查找 if(find==1)//停止条件 break;if(vvs[j].size()==vs.size()){//信息长度相同再匹配,此处先不管path类 int k=0;for(k=0;k<vs.size();k++){if(vvs[j][k]!=vs[k]){//相等ok,不相等匹配<int>和<str> if(isint(vs[k])){if(vvs[j][k]!="<int>")break;}else if(vs[k]!="/"){//判断坑 if(vvs[j][k]!="<str>")break;}elsebreak;}}if(k==vs.size()){//找到了匹配的 cout<<rulename[j]<<' ';//以下是输出参数 for(int m=0;m<vs.size();m++){if(vvs[j][m]!=vs[m]){if(isint(vs[m]))cout<<quling(vs[m])<<' ';elsecout<<vs[m]<<' ';}    }cout<<endl;find=1;break;} }     }if(find==0){//没找到那再看看是不是有path if(attm[i][attm[i].length()-1]!='/')//path类末尾不能是/ for(j=0;j<vvs.size();j++){int k=0;for(k=0;k<vvs[j].size();k++){//找j条规则中的path if(vvs[j][k]=="<path>")break;     }if(k!=vvs[j].size()){//找到了path字符串 int m=0;for(m=0;m<k;m++){if(vvs[j][m]!=vs[m]){if(isint(vs[m])&&vvs[j][m]!="<int>"||(!isint(vs[m])&&vvs[j][m]!="<str>"))//和上面一样匹配path前的 break;}}if(m==k){//匹配成功,进行输出 cout<<rulename[j]<<' ';for(int p=0;p<vvs[j].size()-1;p++){if(vvs[j][p]!=vs[p]){if(isint(vs[p]))cout<<quling(vs[p])<<' ';elsecout<<vs[p]<<' ';}}for(int w=vvs[j].size()-1;w<vs.size()-1;w++)cout<<vs[w]<<'/';cout<<vs[vs.size()-1];cout<<endl;find=1;break;}}}}if(find==0)//没找到 cout<<"404"<<endl;}} 


50是既没处理/xx/ 和/xx不能匹配也没处理int前导0的情况。

ccf 201803-3 URL映射 100分相关推荐

  1. ccf 201612-3 权限查询(100分)

    问题描述 授权 (authorization) 是各类业务系统不可缺少的组成部分,系统用户通过授权机制获得系统中各个模块的操作权限. 本题中的授权机制是这样设计的:每位用户具有若干角色,每种角色具有若 ...

  2. CCF 201712-4 行车路线(100分)

    思路 难点在于 大小路的混合, 连续走 小路时 L1,L2,产生的疲劳值为(L1+L2)的平方,而不是 (L1 的平方 +L2 的平方) 解决思路 把大路和小路分开在两张图上考虑,由于小路的疲劳值为连 ...

  3. ccf 201703-4 地铁修建(100分)

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

  4. CCF之地铁修建(100分)

    问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...

  5. CCF认证201803-3 URL映射

    #include<bits/stdc++.h> using namespace std; string rule[105],ans[105],qer[105]; bool match(st ...

  6. CCF认证考试 202012-5星际旅行 (100分)(线段树)

    题目描述 传送门: 星际旅行 思路 根据题目描述,这道题显然是一道线段树的模板题.动力加和动力增强用对应线段树的区间加和区间乘操作.关键是旋转操作,回忆一下,线段树的区间加和区间乘都有对应的懒标记,而 ...

  7. ccf认证 201712-4行车路线(100分)

    题目: 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连 ...

  8. CCF202012-5 星际旅行【线段树】(100分题解链接)

    试题编号: 202012-5 试题名称: 星际旅行 时间限制: 3.0s 内存限制: 512.0MB 问题描述: 题目描述 乔帝要规划一次星际旅行,星际空间可以视为一个3维坐标系,乔帝有n(n≤1,0 ...

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

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

最新文章

  1. 在Linux中安装SEP Client
  2. 李开复:为什么我认为“AI+”有四阶段
  3. Oracle ebs(E-Business Suite) 电子商务套件 简介
  4. html5设计图的状态栏标准高度,HTML5 canvas自适应手机屏幕宽高度大小
  5. [翻译]现代Linux系统上的栈溢出攻击【转】
  6. Nginx代理概述及环境准备
  7. C++pair对组的创建
  8. FPGA设计——CMOS摄像与HDMI显示(DVP版)
  9. microsoftsql新建登录用户登录失败_史上最简单的Spring Security教程(九):自定义用户登录失败页面...
  10. 邮件 查看html源码,微软 Win10解决邮件显示HTML源代码的问题
  11. html表格填充渐变颜色代码,CSS控制图片、表格、背景颜色渐变示例
  12. DockerKubernetes ❀ Kubernetes集群 - DashBoard服务(Web管理)安装部署
  13. 电脑端微信用户图片DAT格式解码为图片(TK版)
  14. 小牛叔讲Python第6章:for循环-能计数的循环1234567
  15. Android实践:基于聚合数据的手机号码归属地查询
  16. 面试总结 -记周六校招笔试
  17. php开源 饭馆记账软件_个人记账软件 - 开源免费
  18. 银行会员人脸识别方案
  19. Excel速度问题探讨.
  20. 创建VMware集群

热门文章

  1. 软考系统架构师-计算机组成和体系结构
  2. python小技巧5 调整图片像素输出更清晰
  3. Swift编写–仿照Twitter客户端
  4. IoT物联网平台-Doc1
  5. 微软通杀漏洞-CVE-2021-1675复现
  6. freeswitch 显示主叫号码
  7. 手动搭建webpack5 + ts + vue3项目
  8. 【十三届蓝桥杯】2022年蓝桥杯省赛个人解答 C++ B 组
  9. scanf与scanf_s函数你了解吗?
  10. 财务平台打印不完整处理及横向纵向问题