題解:
這道題我只拿到了50分,還有50分是沒有考慮
的情況:
我的思路:
- 輸入(其實這種大型的模擬題將輸入完成了,就完成了三分之一了,其餘的三分之二就是寫出整體的邏輯+調試了):
rule 規則我用一個一維數組保存,每個元素是一個結構體,其中包含了url規則串、url規則名稱,規則串我是用數組保存每個以’‘分隔的字符串。
rule 匹配串我直接用一個二維的字符串數組保存,每一行保存一個rule匹配串的每個以’'分隔的字符串。- 模擬匹配的過程:其實沒什麼別的技巧,就是將每個url匹配串去匹配url規則,開幾個循環就好了,具體看代碼。
但是有個需要處理的點:就是 (我暫時沒有考慮),我是用的兩個函數去判斷。
還有一個需要注意的點:就是如果參數是整數,那麼要去掉前導0(涉及到10分的測點)
代碼:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e5+5;
int n,m;// n-表示URL映射的規則條數 m-待處理的URL地址個數
typedef struct Node
{
vector <string> ruleContent;
string ruleName;
} Node;
vector <Node> rule(100+5);
vector <string> url[100+5];
bool IsString(string str)// 判斷傳入的str是否滿足<str>的條件
{
for(int i = 0; i < (int)str.length(); i++)
{
if(isalnum(str[i]) || str[i] == '-' || str[i] == '_' || str[i] == '.')
{
// 字符串只能有這些內容:大小寫字母、數字、'-'、'_'、'.'
}
else
{
return false;
}
}
return true;
}
bool IsInt(string str)// 判斷傳入的str是否滿足<int>的條件
{
for(int i = 0; i < (int)str.length(); i++)
{
if(!isdigit(str[i]))
{
return false;
}
}
return true;
}
bool IsPath(string str)// 判斷傳入的str是否滿足<path>的條件
{
}
int main()
{
/*
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
*/
cin >> n >> m;
cin.get();
for(int i = 0; i < n; i++)
{
string str;
getline(cin,str);
char *str1 = (char*)str.c_str();
char *result = NULL;
result = strtok(str1," ");
string tmp1 = result; // 分出來的第一個字符串爲規則的內容
//cout << tmp1 << endl;
result = strtok(NULL," ");
string tmp2 = result;// 分出來的第二個字符串爲規則的名稱
//cout << tmp2 << endl;
rule[i].ruleName = tmp2;// 規則的名字
string StrContent = tmp1;// 規則的內容(將以"\"分隔的字符串分隔出來)
char *str2 = (char*)StrContent.c_str();
result = NULL;
result = strtok(str2,"/");
while(result != NULL)
{
string tmp = result;
//cout << tmp << endl;
rule[i].ruleContent.push_back(tmp);
result = strtok(NULL,"/");
}
}
for(int i = 0; i < m; i++)
{
string str;
cin >> str;
char *str2 = (char*)str.c_str();
char *result = NULL;
result = strtok(str2,"/");
while(result != NULL)
{
string tmp = result;
url[i].push_back(tmp);
result = strtok(NULL,"/");
}
}
/*
for(int i = 0; i < n; i++)
{
cout << rule[i].ruleName << " ";
for(int j = 0; j < (int)rule[i].ruleContent.size(); j++)
{
cout << rule[i].ruleContent[j] << " ";
}
cout << endl;
}
for(int i = 0; i < m; i++)
{
for(int j = 0; j < (int)url[i].size(); j++)
{
cout << url[i][j] << " ";
}
cout << endl;
}*/
for(int i = 0; i < m; i++)// url匹配串
{
bool flag = false;// 判斷這個url有無匹配的url規則
// 要能保證 url[i].size() 中的每個字符串都能匹配 url規則的某一行
for(int r = 0; r < n; r++)// 所有的url規則
{
// 規則內容:rule[i].ruleContent (一個字符串數組)
// 規則名稱:rule[i].ruleName (一個字符串)
bool flag1 = true;// 判斷這個url規則能否匹配url[i]
vector <string> res;
res.push_back(rule[r].ruleName);
if(url[i].size() != rule[r].ruleContent.size())
{
flag1 = false;
}
else
{
for(int j = 0; j < (int)url[i].size(); j++)
{
if(url[i][j] == rule[r].ruleContent[j])
{
// 如果兩個字符串相等,直接contniue即可
continue;
}
else
{
// 如果兩個字符串不相等,則要判斷
// 如果rule[i].ruleContent[j]是<int>,那麼url[i][j]就要是int
// 如果rule[i].ruleContent[j]是<str>。那麼url[i][j]就要是string
// 暫時不考慮<path>的情況
if(rule[r].ruleContent[j] == "<int>" && IsInt(url[i][j]))
{
// 如果是整數參數,要去掉前導零
string tmp = url[i][j];
int index = 0;
while(tmp[index] == '0') index++;
res.push_back(tmp.substr(index));
continue;
}
else if(rule[r].ruleContent[j] == "<str>" && IsString(url[i][j]))
{
res.push_back(url[i][j]);
continue;
}
else
{
flag1 = false;
break;
}
}
}
if(flag1)
{
for(int k = 0; k < (int)res.size(); k++)
{
cout << res[k] << " ";
}
cout << endl;
flag = true;
break;
}
}
}
if(!flag)
{
cout << "404" << endl;
}
}
return 0;
}