CCFCSP 201803-2URL映射(60score)

题目来源于CCF CSP


在这里插入图片描述
在这里插入图片描述


思路解析

暴力遍历即可。
目前已知的注意的地方在于:

  1. 整数参数输出时要把前导零去掉。
  2. 题目规定规则中 和 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而 的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。
  3. “/”规则的出现。
    可能存在我未知的一些bug,目前只有60 score.

代码解析

//201803-3 URL映射 grade:60
#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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/108396868