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 问题引出:对于一个稍具规模的网站来说,实现的功能不可能通过 ...
随机推荐
- Codeforces 955C Sad powers(数论)
Codeforces 955C Sad powers 题意 q组询问,每次询问给定L,R,求[L,R]区间内有多少个数可以写成ap的形式,其中a>0,p>1,1 ≤ L ≤ R ≤ 1e1 ...
- 队列(Java实现)
队列的特点是先进先出. 基于链表的队列 public class LinkedListQueue<Item> { private Node first; // 指向最早添加进队列的元素 p ...
- RHSA-2018:0014-重要: linux-firmware 安全更新
修复命令: yum update iwl2030-firmware yum update iwl5000-firmware yum update iwl100-firmware yum update ...
- Leetcode题目102.二叉树的层次遍历(队列-中等)
题目描述: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...
- 前端知识点回顾——Javascript篇(四)
Symbol 为什么需要symbol ES5里面对象的属性名都是字符串,如果你需要使用一个别人提供的对象,你对这个对象有哪些属性也不是很清楚,但又想为这个对象新增一些属性,那么你新增的属性名就很可能和 ...
- sqlserver创建链接服务器连接sqlserver脚本
示例: EXEC sp_addlinkedserver @server='MyLinkServer', --链接服务器别名 @srvproduct='', @provider='SQLOLEDB', ...
- [Python]使用pytest进行单元测试
安装pytest pipenv install pytest 验证安装的版本: pytest --version This , imported /site-packages/pytest.py 接下 ...
- jar/war文件的解释
http://blog.csdn.net/tang_123_/article/details/6012202#comments
- for(foo('a') ; foo('b') && (i<2);foo('c'))的执行结果
static boolean foo(char c) { System.out.println(c); return true; } public static void main(String[] ...
- Selenium 2自动化测试实战41(多线程技术)
多线程技术 python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的,原始的线程以及一个简单的锁.threading基于Java的线程模型设计. 1.th ...