题目来源于CCF CSP
思路解析
暴力遍历即可。 目前已知的注意的地方在于:
整数参数输出时要把前导零去掉。题目规定规则中 和 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而
的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。
“/”规则的出现。 可能存在我未知的一些bug,目前只有60 score.
代码解析
#include<iostream>
#include<vector>
#include<string>
using namespace std
;
vector
<pair
<string
, string
> > regular
;
vector
<string
> Parameter
;
bool
check_str(string
& str
,int pos
) {
int i
= 0, j
= 0;
string restr
= regular
[pos
].first
;
while (i
< str
.size() && j
< restr
.size()) {
if (restr
[j
] == '/' && str
[i
] == '/') {
if (restr
[j
+ 1] == '<') {
int latepos
= restr
.find('>',j
+ 1);
string temp
= restr
.substr(j
+ 2, latepos
- (j
+ 2));
int xipos
;
if (i
== str
.size() - 1)
return false
;
else
xipos
= str
.find('/', i
+ 1);
string value
= str
.substr(i
+ 1, xipos
- i
- 1);
if (temp
== "int") {
for (int i
= 0; i
< value
.size(); i
++) {
if (!isdigit(value
[i
]))
return false
;
}
Parameter
.push_back(to_string(stoi(value
)));
}
else if (temp
== "str") {
Parameter
.push_back(value
);
}
else if (temp
== "path") {
value
= str
.substr(i
+ 1);
Parameter
.push_back(value
);
return true
;
}
i
+= (xipos
- i
);
j
= restr
.find('/', j
+ 1);
}
else {
if (restr
[j
] == str
[i
]) {
i
++;
j
++;
continue;
}
else
return false
;
}
}
else {
if (restr
[j
] == str
[i
]) {
i
++;
j
++;
continue;
}
else
return false
;
}
}
if (i
== str
.size() && j
== restr
.size())
return true
;
return false
;
}
int main()
{
int n
, m
;
string str
= "";
cin
>> n
>> m
;
getchar();
while (n
--) {
getline(cin
, str
);
string ans_string
= str
.substr(str
.find(' ') + 1);
string re_string
= str
.substr(0, str
.find(' '));
regular
.push_back(pair
<string
,string
> (re_string
, ans_string
));
}
bool flag
;
while (m
--) {
cin
>> str
;
flag
= false
;
for (int i
= 0; i
< regular
.size(); ++i
) {
if (Parameter
.size())
Parameter
.clear();
if (check_str(str
, i
)) {
flag
= true
;
cout
<< regular
[i
].second
<< " ";
for (vector
<string
>::iterator it
= Parameter
.begin(); it
!= Parameter
.end();++it
) {
if (it
!= Parameter
.end() - 1)
cout
<< *it
<< " ";
else
cout
<< *it
;
}
cout
<< endl
;
}
}
if (!flag
)
cout
<< "404" << endl
;
}
return 0;
}
转载请注明原文地址:https://tech.qufami.com/read-20797.html