CCF-CSP-2018-3-3 URL對映
題目:
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: |
問題描述 URL 對映是諸如 Django、Ruby on Rails 等網頁框架 (web frameworks) 的一個重要元件。對於從瀏覽器發來的 HTTP 請求,URL 對映模組會解析請求中的 URL 地址,並將其分派給相應的處理程式碼。現在,請你來實現一個簡單的 URL 對映功能。 輸入格式 輸入第一行是兩個正整數 n 和 m,分別表示 URL 對映的規則條數和待處理的 URL 地址個數,中間用一個空格字元分隔。 輸出格式 輸入共 m 行,第 i 行表示 qi 的匹配結果。如果匹配成功,設匹配了規則 pj ,則輸出對應的 rj。同時,如果規則中有引數,則在同一行內依次輸出匹配後的引數。注意整數引數輸出時要把前導零去掉。相鄰兩項之間用一個空格字元分隔。如果匹配失敗,則輸出 404。 樣例輸入 5 4 樣例輸出 year_archive 2004 樣例說明 對於第 1 個地址 /articles/2004/,無法匹配第 1 條規則,可以匹配第 2 條規則,引數為 2004。 資料規模和約定 1 ≤ n ≤ 100,1 ≤ m ≤ 100。 |
程式碼:
#include<iostream>
#include<string>
using namespace std;
bool f(string s1, string s2,bool flag)
{
int k1 = 0, k2 = 0, len1 = s1.length(), len2 = s2.length();
while (k1 < len1 && k2 < len2)
{
if (s1[k1] == s2[k2])
{
k1++, k2++;
continue;
}
if (s1[k1++] != '<')return false;
if (flag)cout << ' ';
if (s1[k1] == 'i')
{
bool flag2 = false;
while (s2[k2] && s2[k2] >= '0' && s2[k2] <= '9')
{
if (s2[k2] > '0')flag2 = true;
if (flag2 && flag)cout << s2[k2];
k2++;
}
if (!flag2)return false;
k1 += 4;
continue;
}
if (s1[k1] == 's')
{
bool flag2 = false;
while (s2[k2] && s2[k2] != '/')
{
flag2 = true;
if (flag)cout << s2[k2];
k2++;
}
if (!flag2)return false;
k1 += 4;
continue;
}
if (s1[k1] == 'p')
{
if (flag)while (s2[k2])cout << s2[k2++];
return true;
}
}
return (k1 == len1 && k2 == len2);
}
int main()
{
int n, m;
cin >> n >> m;
string sn[100], name[100], s;
for (int i = 0; i < n; i++)cin >> sn[i] >> name[i];
for (int i = 0; i < m; i++)
{
cin >> s;
bool flag = true;
for (int i = 0; i < n && flag; i++)if (f(sn[i], s,false))
{
flag = false;
cout << name[i];
f(sn[i], s, true);
}
if (flag)cout << "404";
cout << endl;
}
return 0;
}
<iostream>
#include<string>
using namespace std;
bool f(string s1, string s2,bool flag)
{
int k1 = 0, k2 = 0, len1 = s1.length(), len2 = s2.length();
while (k1 < len1 && k2 < len2)
{
if (s1[k1] == s2[k2])
{
k1++, k2++;
continue;
}
if (s1[k1++] != '<')return false;
if (flag)cout << ' ';
if (s1[k1] == 'i')
{
bool flag2 = false;
while (s2[k2] && s2[k2] >= '0' && s2[k2] <= '9')
{
if (s2[k2] > '0')flag2 = true;
if (flag2 && flag)cout << s2[k2];
k2++;
}
if (!flag2)return false;
k1 += 4;
continue;
}
if (s1[k1] == 's')
{
bool flag2 = false;
while (s2[k2] && s2[k2] != '/')
{
flag2 = true;
if (flag)cout << s2[k2];
k2++;
}
if (!flag2)return false;
k1 += 4;
continue;
}
if (s1[k1] == 'p')
{
if (flag)while (s2[k2])cout << s2[k2++];
return true;
}
}
return (k1 == len1 && k2 == len2);
}
int main()
{
int n, m;
cin >> n >> m;
string sn[100], name[100], s;
for (int i = 0; i < n; i++)cin >> sn[i] >> name[i];
for (int i = 0; i < m; i++)
{
cin >> s;
bool flag = true;
for (int i = 0; i < n && flag; i++)if (f(sn[i], s,false))
{
flag = false;
cout << name[i];
f(sn[i], s, true);
}
if (flag)cout << "404";
cout << endl;
}
return 0;
}
補更:
熱心網友給出了輸入用例,當<int>匹配的是0時本程式會匹配失敗,這是一個bug
輸入用例:
1 1
/<int>/ aa
/0/