CCF-URL映射-(正则匹配)-20180303
果然正则表达式是一个强大的工具
更短的代码....hhh
版本1: 正则表达式..so easy~~
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <regex>
using namespace std;
const int N = ;
const string s_int = "([0-9]+)";
const string s_str = "([0-9A-Za-z-_\.]+)";
const string s_path = "([0-9A-Za-z-_\./]+)";
string rule[N], na[N];
vector <int> p[N]; // 表示匹配项类型 1-int;2-str;3-path
int n, m;
smatch sm;
string _deal(string str, int k) {// 将"int"->s_int'... 变成正则表达式的情况
string ans;
for (int i = ; i < str.size(); i++) {
if (str[i] == '<') {
string tmp; i++;
while (str[i] != '>')
tmp.push_back(str[i++]);
if (tmp == "int") { ans += s_int; p[k].push_back(); }
else if (tmp == "str") { ans += s_str; p[k].push_back(); }
else { ans += s_path; p[k].push_back(); }
}
else ans.push_back(str[i]);
}
return ans;
}
int main()
{
cin >> n >> m;
for (int i = ; i <= n; i++) {
string s1;
cin >> s1 >> na[i];
rule[i] = _deal(s1, i);
}
for (int i = ; i <= m; i++) {
string str; cin >> str;
string ans = ""; int k = ;
for (; k <= n; k++) {
regex re(rule[k]);
if (regex_match(str,sm,re)) {
ans = na[k];
break;
}
}
cout << ans;
if (ans != "")
for (int j = ; j < p[k].size(); j++) {
if (p[k][j] == ) cout << " " <<stoi(sm[j+]);
else cout << " " << sm[j+];
}
cout << "\n";
}
//system("pause");
return ;
版本2: split() 用/来分割字符串 [以前写的 好复杂啊
#include <bits/stdc++.h>
using namespace std;
vector <string> name();
vector < vector <string> > rule();
vector <string> ans;
bool wei[];
bool isdight (char x) {
return x>=''&&x<='';
}
bool ischar (char x) {
if (isdight(x) )
return true;
if ( (x>='A' && x<='Z') || (x>='a' && x<='z') )
return true;
if ( x=='/' || x=='-' || x=='_' || x=='.')
return true;
return false;
}
vector <string> split (const string& str,const char flag=' ') {
istringstream iss(str);
vector <string> sv;
string tmp;
while (getline(iss,tmp,flag))
sv.push_back(tmp);
return sv;
}
bool isok (string str) {
if (str[]!='/') return ;
for (int i=;i<str.size();i++) {
if (!ischar(str[i]))
return ;
}
return ; }
string dtoc (int x) {
string str;
if (x==) return "";
while (x) {
str+=x%+'';
x/=;
}
reverse(str.begin(),str.end());
return str;
}
bool ismatch (int k, string str) {
bool flag=;
ans.clear();
if (str[str.size()-]=='/') flag=;
vector <string> sv=split (str,'/'); for (int i=;i<rule[k].size();i++) {
if (i>=sv.size()) return ;
int len=sv[i].size();
if (rule[k][i]=="<int>") {
int sum=;
for (int j=;j<len;j++) {
if (!isdight(sv[i][j])) return ;
sum=sum*+sv[i][j]-'';
}
ans.push_back(dtoc(sum));
} else if (rule[k][i]=="<str>")
ans.push_back(sv[i]); else if (rule[k][i]=="<path>") {
string tmp;
for (int k=i;k<sv.size();k++) {
tmp+=sv[k];
if (k==sv.size()-&&!flag) continue;
tmp+="/";
}
ans.push_back(tmp);
return ;
} else {
if (sv[i]!=rule[k][i]) return ;
} }
if (rule[k].size()==sv.size()&&(flag==wei[k])) return ; // 真的是傻逼
else return ;
}
int n,m;
int main ()
{
cin>>n>>m; getchar();
string s1,s2;
for (int i=;i<=n;i++) {
cin>>s1>>s2; getchar();
name[i]=s2;
if (s1[s1.size()-]=='/') wei[i]=;// 没有考虑的地方
rule[i]=split(s1,'/');
}
for (int i=;i<=m;i++) {
getline (cin,s1); int x=;
if (isok(s1)) {
for (int j=;j<=n;j++)
if (ismatch(j,s1)) {
x=j;
break;
}
}
if (x==) cout<<""<<endl;
else {
cout<<name[x];
for (int j=;j<ans.size();j++)
cout<<" "<<ans[j];
cout<<endl;
}
}
return ;
}
CCF-URL映射-(正则匹配)-20180303的更多相关文章
- Django2.0以上版本的URL的正则匹配问题
正则表达式形式的URL匹配问题: 1.导入re_path from django.urls import path,re_path 2.进行正则匹配 re_path('detail-(\d+).htm ...
- CCF(URL映射:80分):字符串处理+模拟
URL映射 CCF201803-3 #include<iostream> #include<cstdio> #include<cstring> #include&l ...
- 基于URL的正则匹配
第一种的方式使用( <li><a target="_blank" href="/CC/detail/?nid={{ k}}">{{ ro ...
- SpringMvc如何将Url 映射到 RequestMapping (二)
昨天简单分析了Springmvc 中 RequestMapping 配置的url和请求url之间的匹配规则.今天详细的跟踪一下一个请求url如何映射到Controller的对应方法上 一.入口 org ...
- CCF 201803-3 URL映射
CCF 201803-3 URL映射 试题编号: 201803-3 试题名称: URL映射 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 URL 映射是诸如 Django. ...
- 正则匹配之url的匹配
通过这几天的学习,已经对正则有所了解了. 下面动手写一个匹配url的正则吧. <?php $str="http://www.baidu.com"; $reg="/( ...
- js:通过正则匹配获取页面的url中的参数
简介:获取页面参数 原生js: //通过正则匹配获取当前页面的url中的参数 function getUrlParam(name){ var reg = new RegExp("(^|&am ...
- Django2.0版本 path与Django1.x版本url正则匹配问题
Django1.x版本url正则匹配如下: Django2.0版本正则匹配则要导入re_path模块如下:
- CCF CSP 201803-3 URL映射
转载自 https://blog.csdn.net/tigerisland45/article/details/81697594 /* CCF201803-3 URL映射 */ #include &l ...
随机推荐
- day02编程语言,Python语言介绍,Python解释器安装,环境变量,Python代码执行,pip,应用程序使用文件的三步骤,变量,变量的三大组成,比较,pycharm
复习 重点: 1.进制转换:二进制 与十六进制 2.内存分布:栈区 与堆区 # 二进制1111转换十六进制 => 8 4 2 1 => f 10101100111011 => 2a7 ...
- libcurl返回常见错误码
转载:https://blog.csdn.net/kenkao/article/details/46875571 转载:http://www.cnblogs.com/wainiwann/p/34929 ...
- linux --- 10.常见命令
1.在登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么()A.NID B.PID C.UID C.CID 2.下面那个用户存放用户密码信息()A./boot B./etc ...
- Springboot学习笔记(一)-线程池的简化及使用
工作中经常涉及异步任务,通常是使用多线程技术,比如线程池ThreadPoolExecutor,它的执行规则如下: 在Springboot中对其进行了简化处理,只需要配置一个类型为java.util.c ...
- Progressive Scramble【模拟】
问题 J: Progressive Scramble 时间限制: 1 Sec 内存限制: 128 MB 提交: 108 解决: 45 [提交] [状态] [命题人:admin] 题目描述 You ...
- EXEC sp_executesql with multiple parameters
传递多个参数 https://stackoverflow.com/questions/28481189/exec-sp-executesql-with-multiple-parameters http ...
- UVA1388 Graveyard
思路 就是对于每个点,找出离他最近的目标点的距离 我使用了上取整和下取整实现,蓝书上的实现方法是坐标系缩放,每个点的目标位置就是它四舍五入的结果 具体证明见蓝书 代码 #include <cst ...
- ComponentOne 产品经理:为什么要从C1Report迁移到FlexReport
概述 如果你正在使用ComponentOne Enterprise 的Reports for WinForm 报表控件(C1Report),你一定会喜欢更为强大的FlexReport! FlexRep ...
- VS工作目录,输出目录
C++项目,解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹(共四个东东,其中Debug和Release文件夹中存放最终生成的结果e ...
- npm init 命令生成package.json文件
通过npm init 命令可以生成一个package.json文件.这个文件是 整个项目的描述文件.通过这个文件可以清楚的知道项目的包依赖关系,版本,作者等信息.每个NPM包都有自己的package. ...