ccf url映射

交了整整20遍终于过了,题目意思不清楚真的非常坑

题目思路:

1.先记录下规则末尾是不是'/',然后把'/‘变成 '  ’用stringstream读入

2.如果规则中没有<path>,可以先判断规则和url地址的字符串数是不是相等,正常匹配,一旦不符合flag = 0,然后最坑的是再判断一下规则和url后面是不是都有'/‘或都没有,必须相同才能匹配,这个没有就60分了,实在没看出来他那里说清楚了

3如果规则中有<path>,注意path能匹配的参数是可带'/’的字符串,abcd/0123/   和 js/jquery.js都是匹配<path>的,把规则后面所有的字符串加上就可以了,末尾应该要看他是abcd/0123/还是 js/jquery.js判断是否加'/‘,但是统统不加能过,都加了过不了;

4.不用goto语句的话写成函数也很好,

5.数据很水,没有<int> 参数为0的数据,不然我前面的代码过不了。

100分代码,很多逻辑不太顺的地方,懒得改了,

代码如下

#include <iostream>
#include <string>
#include <cstring>
#include <string.h>
#include <sstream>
#include <stdio.h>
#include <set>
#include <sstream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <stack>
#include <time.h>
#include <math.h>
#include <ctype.h>
#include <list>
#include <map>
#include<cstdlib>
#include <sstream>
using namespace std;
#define ctime								printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
#define fast                                ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define _for(i,a,b)                         for(int i = a;i < b;i++)
#define _rep(i,a,b)                         for(int i = a;i <= b;i++)
#define all(s)                              s.begin(), s.end()
#define local								freopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#define ll									long long
#define fi									first
#define	se									second

const int INF = 1e9;
const int mod = 1000;
const int maxn = 2e4+50;

int n, m,ip[105];
vector<string> rul[105],ans[105],tmp;
string st[105],s;

int main() {
	//local
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		cin >> s >> st[i];
		int len = s.length();
		if (s[len - 1] != '/') ip[i] = 1;
		else ip[i] = 0;
		for (int j = 0; j < len; j++) {
			if (s[j] == '/') s[j] = ' ';
		}
		stringstream ss(s);
		string str;
		while (ss >> str) rul[i].push_back(str);
	}
	for (int i = 0; i < m; i++) {
		cin >> s;
		int len = s.length(), isp = 0;
		bool ok = false;
		if (s[len - 1] != '/') isp = 1;
		for (int j = 0; j < len; j++) {
			if (s[j] == '/') s[j] = ' ';
		}
		stringstream ss(s);
		string str;
		tmp.clear();
		while (ss >> str) tmp.push_back(str);
		for (int j = 0; j < n; j++) {
			if (ok) break;
			ans[j].clear();
			int rn = rul[j].size(),flag = 1,ts = tmp.size(),k;
			for (k = 0; k < rn && k < ts; k++) {
				if (rul[j][k] == tmp[k]);
				else if (rul[j][k] == "<int>") {
					int ilen = tmp[k].length(), isnum = 1,first = 1;
					string num = "";
					for (int t = 0; t < ilen; t++) {
						if (tmp[k][t]<'0' || tmp[k][t] > '9') {
							isnum = 0;
							break;
						}
						if (first && tmp[k][t] != '0') {
							first = 0;
							num += tmp[k][t];
						}
						else if (!first) num += tmp[k][t];
					}
					if (!isnum) {
						flag = 0;
						break;
					}
					else {
						if (num == "") num = "0";
						ans[j].push_back(num);
					}
				}
				else if (rul[j][k] == "<str>") ans[j].push_back(tmp[k]);
				else if(rul[j][k] == "<path>") {
					string pat = "";
					while (k < tmp.size() - 1)  pat += tmp[k++] + '/';
					pat += tmp[k];
					ans[j].push_back(pat);
					flag = 1;
					goto lable;
				}
				else {
					flag = 0;
					break;
				}
			}
			if (ts != rn || isp != ip[j]) {
				flag = 0;
				continue;
			}
			lable:;	
			if (flag) {
				ok = true;
				cout << st[j];
				for (int k = 0; k < ans[j].size(); k++)
					cout << " " << ans[j][k];
				cout << endl;
			}
		}
		if (!ok) cout << "404" << endl;
	}
}

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值