概述
C++满分代码(思路都写在注释里了):
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
string result; //注意result是全局的
struct Match
{
string line; //一行字符串
string str[100]; //str[number+1]保存名称
int number; //str[0, number]保存匹配项
int end; //末尾是否有'/' (本题的一个巨坑)
};
void deal_line(Match& t) //处理rule或url
{
t.end = 0;
t.number = -1;
for(int i=0; i<t.line.size(); ++i)
{
if(t.line[i] == '/')
{
if(t.line[i+1] != ' ') t.number++; //如果'/'后面不是' ',说明后面还有匹配项,不是最后一个'/' (针对rule)
else t.end = 1; //反之,说明它以'/'结尾 (针对rule)
}
else if(t.line[i] == ' ') //把rule的名称保存在 str[number+1]
{
for(i=i+1; i<t.line.size(); ++i)
t.str[t.number+1] += t.line[i];
}
else t.str[t.number] += t.line[i];
}
}
bool isNumber(string& a)
{
for(size_t i=0; i<a.size(); ++i)
{
if(!isdigit(a[i])) //存在非数字字符:false
return false;
}
for(size_t i=0; i<a.size()-1; ++i)
{
if(a[i] == '0') //删除前导0
{
a.erase(a.begin()+i);
--i;
}
else break;
}
return true;
}
bool match_str(string rule, string url) //处理除了<path>的匹配,并result+=参数+" "
{
if(rule.compare("<int>") == 0)
{
if(isNumber(url)) result += url + " "; //是否对应int,调用函数 isNumber(string& a)
else return false;
}
else if(rule.compare("<str>") == 0) //字符串直接加上
{
result += url + " ";
}
else //文字对文字的匹配,判断其是否一样即可
{
if(rule != url)
return false;
}
return true;
}
bool match(Match& r,Match& u) //r是rule,u是url
{
if(r.str[r.number].compare("<path>") != 0 && u.number > r.number) return false; //若url的匹配项比rule的多,且rule的最后一项不是path:false
else if(r.number > u.number) return false; //
else if(r.end != u.end) return false; //(巨坑)
result = r.str[1 + r.number] + " "; //保存需要输出的结果
for(int i=0; i<=r.number; ++i)
{
if(r.str[i].compare("<path>") != 0) //如果不是path,调用函数进行匹配
{
if(match_str(r.str[i],u.str[i]) == false)
return false;
}
else //如果是path,特判
{
if(u.str[i].empty()) return false; //path对应空字符:false
else //否则true,处理result
{
for(int j=i; j<=u.number; ++j)
result += u.str[j] + "/"; //每个匹配项后面都加上'/'
if(u.end == 0) result.erase(result.end() - 1); //如果原本末尾没有'/',就删掉它
}
}
}
return true;
}
int main()
{
ios::sync_with_stdio(false); //关同步
cin.tie(0);
int n,m;
cin>>n>>m;
cin.ignore(100,'n');
Match rule[n],url[m]; //rule和url 结构体数组
for(int i=0; i<n; ++i)
{
getline(cin,rule[i].line); //输入rule并处理
deal_line(rule[i]);
}
for(int i=0; i<m; ++i)
{
getline(cin,url[i].line); //同理处理url
deal_line(url[i]);
if(url[i].line[url[i].line.size()-1] == '/') //url是否以'/'结尾
{
url[i].number--;
url[i].end = 1;
}
}
bool flag = false; //是否匹配成功
for(int i=0; i<m; ++i)
{
flag = false;
for(int j=0; j<n; ++j)
{
if(match(rule[j],url[i]) == true)
{
flag = true;
break;
}
}
if(result[result.size()-1] == ' ') result.erase(result.end()-1); //result最后如果有空格,删掉
cout<<(flag ? result : "404");
if(i != m-1) cout<<endl; //换行问题
}
return 0;
}
最后
以上就是自然白云为你收集整理的【CCF 201803-3】 URL映射的全部内容,希望文章能够帮你解决【CCF 201803-3】 URL映射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复