201803-3 URL映射
本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将请求中的 URL 地址按照配置的先后顺序逐一与这些规则进行匹配。当遇到第一条完全匹配的规则时,匹配成功,得到匹配的规则以及匹配的参数。若不能匹配任何一条规则,则匹配失败。
本题输入的 URL 地址是以斜杠 / 作为分隔符的路径,保证以斜杠开头。其他合法字符还包括大小写英文字母、阿拉伯数字、减号 -、下划线 _ 和小数点 .。例如,/person/123/ 是一个合法的 URL 地址,而 /person/123? 则不合法(存在不合法的字符问号 ?)。另外,英文字母区分大小写,因此 /case/ 和 /CAse/ 是不同的 URL 地址。
对于 URL 映射规则,同样是以斜杠开始。除了可以是正常的 URL 地址外,还可以包含参数,有以下 3 种:
字符串 <str>:用于匹配一段字符串,注意字符串里不能包含斜杠。例如,abcde0123。
整数 <int>:用于匹配一个不带符号的整数,全部由阿拉伯数字组成。例如,01234。
路径 <path>:用于匹配一段字符串,字符串可以包含斜杠。例如,abcd/0123/。
以上 3 种参数都必须匹配非空的字符串。简便起见,题目规定规则中 <str> 和 <int> 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而 <path> 的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。
第 2 行至第 n+1 行按匹配的先后顺序描述 URL 映射规则的配置信息。第 i+1 行包含两个字符串 pi 和 ri,其中 pi 表示 URL 匹配的规则,ri 表示这条 URL 匹配的名字。两个字符串都非空,且不包含空格字符,两者中间用一个空格字符分隔。
第 n+2 行至第 n+m+1 行描述待处理的 URL 地址。第 n+1+i 行包含一个字符串 qi,表示待处理的 URL 地址,字符串中不包含空格字符。
/articles/2003/ special_case_2003
/articles/<int>/ year_archive
/articles/<int>/<int>/ month_archive
/articles/<int>/<int>/<str>/ article_detail
/static/<path> static_serve
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/static/js/jquery.js
article_detail 1985 9 aloha
404
static_serve js/jquery.js
对于第 2 个地址 /articles/1985/09/aloha/,只能匹配第 4 条规则,参数依次为 1985、9(已经去掉前导零)和 aloha。
对于第 3 个地址 /articles/hello/,无法匹配任何一条规则。
对于第 4 个地址 /static/js/jquery.js,可以匹配最后一条规则,参数为 js/jquery.js。
所有输入行的长度不超过 100 个字符(不包含换行符)。
保证输入的规则都是合法的。
#include <bits/stdc++.h> using namespace std;
const int N = + ; int n, m;
vector<string> reg[N];
vector<string> reg_name; void format_reg(int c, string & line)
{
stringstream ss(line);
string name;
ss >> line >> name;
reg_name.push_back(name); for(int i = ; i < (int)line.length(); i++) {
if(line[i] == '/') {
reg[c].push_back("/");
}else {
if(reg[c].back() == "/") {
reg[c].push_back(string(&line[i], &line[i] + ));
}else {
string & tmp = reg[c].back();
tmp += string(&line[i], &line[i] + );
}
}
}
} void url_split(string &url, vector<string> &urls)
{
for(int i = ; i < url.length(); i++) {
if(url[i] == '/') {
urls.push_back("/");
}else {
if(urls.back() == "/") {
urls.push_back(string(&url[i], &url[i] + ));
}else {
string & tmp = urls.back();
tmp += string(&url[i], &url[i] + );
}
}
}
}
bool is_int(string & s)
{
for(int i = s.length() - ; i >= ; i--) {
if(!isdigit(s[i])) return false;
}
return true;
} bool is_equal(string & regn, vector<string> & urls, vector<string> & param)
{ if(urls.size() == ) return false;
if(regn == urls.front()) {
urls.erase(urls.begin());
return true;
}else if(regn == "<path>") {
string tmp = "";
for(int j = ; j < (int)urls.size(); j++) {
tmp += urls[j];
}
param.push_back(tmp);
urls.clear();
return true;
}else if(regn == "<int>") {
if(is_int(urls.front())) {
param.push_back(urls.front());
urls.erase(urls.begin());
return true;
}
return false;
}else if(regn == "<str>") {
param.push_back(urls.front());
urls.erase(urls.begin());
return true;
}
return false;
} bool match(const int &c, string url, vector<string> & param)
{
vector<string> urls;
stringstream ss(url);
url_split(url, urls); for(size_t i = ; i < reg[c].size(); i++) {
if(!is_equal(reg[c][i], urls, param)) return false;
if(urls.size() == && i == reg[c].size() - ) return true;
} return false;
} void print_reg()
{
for(int i = ; i < n; i++) {
for(auto & tmp : reg[i]) cout << tmp << " ";
cout << endl;
}
} int get_result(string & url, vector<string> & param)
{ for(int i = ; i < n; i++) {
param.clear();
//cout << "---------------------------" << endl;
if(match(i, url, param)) return i;
}
return -;
} int main()
{
cin >> n >> m;
cin.ignore();
string line;
for(int i = ; i < n; i++) {
getline(cin, line);
format_reg(i, line);
}
//print_reg(); vector<string> param;
for(int i = ; i < m; i++) {
getline(cin, line);
int ans = get_result(line, param);
if(ans == -) {
cout << << endl;
}else {
cout << reg_name[ans]<< " ";
for(int i = ; i < (int)param.size(); i++) {
if(is_int(param[i])) {
int ans = atoi(param[i].c_str());
cout << ans << " ";
}else
cout << param[i] << " ";
}
cout << endl;
}
}
}
201803-3 URL映射的更多相关文章
- ASP.NET MVC 5 Web编程2 -- URL映射(路由原理)
本章将讲述ASP.NET MVC5 的路由原理,即URL映射机制. 简单点就是解释:为什么MVC在浏览器输入地址就能访问到类(或类中的方法)?这是怎么做到的?我自己可以通过.NET写出一个自己的MVC ...
- urlMappings与URL映射
此配置节的作用就是往Web程序中添加URL的映射,从而达到用户访问映射后的URL(如/Page/AAA)也能访问到源URL(如/Page/PageAAA.aspx)的效果.这也是URL映射本来的作用. ...
- django中“url映射规则”和“服务端响应顺序”
1.django搜索路径 使用 import 语句时,Python 所查找的系统目录清单. 查看方式: import sys print sys.path ...
- MVC 5 Web编程2 -- URL映射
ASP.NET MVC 5 Web编程2 -- URL映射(路由原理) 2015-02-12 08:50 by hangwei, 704 阅读, 5 评论, 收藏, 编辑 本章将讲述ASP.NET M ...
- CCF CSP 201803-3 URL映射
转载自 https://blog.csdn.net/tigerisland45/article/details/81697594 /* CCF201803-3 URL映射 */ #include &l ...
- SpringMvc的Url映射和传参案例(转)
Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...
- SpringMvc的Url映射和传参案例
Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...
- 使用 IntraWeb (32) - Url 映射与 THandlers
最简单的 Url 映射是使用 TIWAppForm 的 class 方法: SetURL; THandlers 是 IntraWeb XIV 新增的内容处理器, 它能完成的不仅仅是 Url 映射(转发 ...
- Django - 将URL映射到视图
URLconf 就像是 Django 所支撑网站的目录.它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表.你就是以这种方式告诉 Django,对于这个 URL 调用这段代码, ...
- 搭建RESTful API 之 实现WSGI服务的URL映射
javarestfull 搭建参考 http://blog.csdn.net/hejias/article/details/47424511 问题引出:对于一个稍具规模的网站来说,实现的功能不可能通过 ...
随机推荐
- Python3 Address already in use 解决方法
1.查看使用端口号netstat -ntlp 2.根据端口号找到pid 3.杀死程序 kill -9 pid 4.重新启动程序 简单粗暴 我使用python3时编写Socket,linux系统下使用c ...
- 【洛谷4542】 [ZJOI2011]营救皮卡丘(最小费用最大流)
传送门 洛谷 Solution 这是一道神仙题! 考虑这个东西是个啥. emmm,如果两个点要到达,一定不能经过比他们大的. 所以Floyd搞定两点距离然后费用流跑一遍就是答案了! 代码实现 /* m ...
- Linux终端中文显示乱码
今天,帮我们同学处理一下中文显示乱码的问题.这个是个国内Linux用户烦恼的问题,由于大部分的Linux发行版都是以英语为主体的,而且英文在通用性和稳定性上都比中文要好一些,各种奇怪的BUG也要少一点 ...
- NET全控件
NBSI WebSite Injection ReportSite Address: www.xmht.comInject URL: http://www.xmht.com/news.aspx?sty ...
- Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_汇总贴
51CTO学院 Java商城秒杀系统的设计与实战视频教程(SpringBoot版) H:\BaiDu\微服务0830\2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版) ...
- Delphi编写的等长加密与解密
最近在看一本关于网络游戏服务端开发的书,虽然该书是个空架子,里面没有多少实际的内容(此书评价不好),但其中关于等长加密与解密的代码还是有一定的借鉴作用的.他山之石,可以攻玉.因为书中是C++的代码,所 ...
- 如何写resultful接口
一.协议 API与客户端用户的通信协议,总是使用HTTPS协议,以确保交互数据的传输安全. 二.域名 应该尽量将API部署在专用域名之下: https://api.example.com 如果确定AP ...
- Linux0.11学习
Linux 0.11虽然不是什么“珠穆朗玛峰”,但它肯定还是“华山”或“泰山”.虽然有路但你还是需要最基本的努力和花费一定的代价才能“攀登”上去.1. PC兼容机硬件工作原理(比如8259A,8253 ...
- 数组setArray和addObjectsFromArray的区别
-setArray:用另一个数组中的所有对象来替换当前数组中的所有对象 -addObjectsFromArray:在原数组最后添加另一个数组的全部对象 NSArray *arr = @["] ...
- 鸟哥私房菜基础篇:Linux 账号管理与 ACL 权限配置习题
猫宁!!! 参考:http://cn.linux.vbird.org/linux_basic/0410accountmanager.php 1-root 的 UID 与 GID 是多少?而基于这个理由 ...