概述
没什么难度,主要还是如何很好的把字符串处理成结构体
逻辑处理的时候,先分为两类,一类是有path的,一类是没有path的,没有path的先通过匹配项数过滤掉一部分,然后逐项匹配,其中int是判断是否是数字,str直接通过;判断path的时候,从当前项到最后全部都是。
匹配到的特殊项加入vector,最后统一输入,path匹配的需要把相应的项用字符串连接到一起
然后如果结尾有斜杠的话特殊需要特殊处理一下。
这个题做起来还蛮顺的,处理字符串处理好了是真的方便。不过因为题目没说会用到多长的字符串,所以构建的char数组大了一些,内存消耗有点大。
PS:我试着调小了一些数组大小,能通过,但是耗时不是0ms了是什么鬼?减少了数组大小会增加耗时?有懂的吗?
这个题我还想构建树结构,后来觉得太麻烦了,结果不用树结构一一匹配也能完成。。。
#include<bits/stdc++.h>
using namespace std;
struct match{
string c;
int type;//0 == string,2==str,1==int,3==path,4==slash,5==name
bool init;
bool knum;
int num = -1;
bool isnum(){
if(init){
return knum;
}else{
for(int i = 0;i<c.size();i++)
{
if(c[i] >= '0' && c[i]<='9'){
}else{
knum = false;
init = true;
return knum;
}
}
init = true;
knum = true;
sscanf(c.data(),"%d",&num);
char tmp[80];
sprintf(tmp,"%d",num);
c = tmp;
return knum;
}
}
};
struct url{
match surl[100];
int number;
bool slash;
bool mpath;
string name;
void initial(char *s){
number = 0;
slash = false;
mpath = false;
char url[2500],_name[2500];
sscanf(s,"%s%*c%[^n]",url,_name);
name = _name;
char sub[80];
int size = strlen(url);
int iter;
for(int i = 0;i<size-1;)
{
sscanf(url+i,"%*c%[^/]%n",sub,&iter);
i+=iter;
match tmp;
tmp.c = sub;
tmp.type = judgetype(tmp.c);
if(tmp.type == 3){
mpath = true;
}
surl[number++]=tmp;
}
if(url[size-1]=='/'){
slash = true;
}
}
int judgetype(string &s)
{
if(s[0]!='<'){
return 0;
}else{
if(s.find("str")!=-1){
return 2;
}
if(s.find("int")!=-1){
return 1;
}
if(s.find("path")!=-1){
return 3;
}
}
return -1;
}
};
bool match(url &rule,url &u){
vector<string> mstr;
if(rule.mpath)
{
for(int i = 0;i<rule.number;i++)
{
int rtype = rule.surl[i].type;
if(rtype == 0){
if(rule.surl[i].c != u.surl[i].c)
{
return false;
}
}else if(rtype == 1){
if(!u.surl[i].isnum()){
return false;
}
mstr.push_back(u.surl[i].c);
}else if(rtype == 2){
mstr.push_back(u.surl[i].c);
continue;
}else if(rtype == 3){
string s = "";
for(int j = i;j<u.number;j++)
{
s+=u.surl[j].c;
if(j <u.number-1)
{
s+="/";
}
}
if(u.slash){
s+="/";
}
mstr.push_back(s);
}
}
printf("%s ",rule.name.data());
for(int i = 0;i<mstr.size();i++)
{
printf("%s ",mstr[i].data());
}
printf("n");
return true;
}else{
if(rule.number != u.number){
return false;
}else if(rule.slash != u.slash){
return false;
}
for(int i = 0;i<rule.number;i++)
{
int rtype = rule.surl[i].type;
if(rtype == 0){
if(rule.surl[i].c != u.surl[i].c)
{
return false;
}
}else if(rtype == 1){
if(!u.surl[i].isnum()){
return false;
}
mstr.push_back(u.surl[i].c);
}else if(rtype == 2){
mstr.push_back(u.surl[i].c);
continue;
}else if(rtype == 3){//不可能出现这种情况
}
}
printf("%s ",rule.name.data());
for(int i = 0;i<mstr.size();i++)
{
printf("%s ",mstr[i].data());
}
printf("n");
return true;
}
}
int main() {
int n,m;
scanf("%d%d%*c",&n,&m);
url u[100],ma;
char line[5000];
for(int i = 0;i<n;i++)
{
fgets(line,5000,stdin);
u[i].initial(line);
}
for(int i = 0;i<m;i++)
{
fgets(line,5000,stdin);
ma.initial(line);
bool succ = false;
for(int j = 0;j<n;j++)
{
bool res = match(u[j],ma);
if(res){
succ = true;
break;
}
}
if(!succ)
{
printf("404n");
}
}
return 0;
}
最后
以上就是疯狂曲奇为你收集整理的CCF201803-3,URL映射的全部内容,希望文章能够帮你解决CCF201803-3,URL映射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复