思路就是,先把字符串分开存到vector中
分为3种情况,无通配符,单通配符和双通配符
无通配符和单通配符直接扫一遍,双通配符判断前缀和后缀是否相等
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double llb;
#define F(i, a, b) for (ll i = (a); i <= (b); i++)
#define DF(i, a, b) for (int i = (a); i >= (b); i--)
#define FE(i, a, b, c) for (int i = (a); i <= (b); i += (c))
#define DFE(i, a, b, c) for (int i = (a); i >= (b); i -= (c))
#define ED(i, u) for (int i = hea[u]; i; i = nex[i])
#define pii pair<int, int>
#define fi first
#define se second
#define All(x) x.begin(), x.end()
#define MST(x) memset(x, 0, sizeof(x))
#define PI acos(-1)
template <class... T> void re(T &...a) { (cin >> ... >> a); }
template <class T, class... Ts> void pr(const T &a, const Ts &...b) {
cout << a;
(cout << ... << (cout << ' ', b));
cout << '\n';
}
template <class T, class... Ts> void prs(const T &a, const Ts &...b) {
cout << a;
(cout << ... << (cout << ' ', b));
cout << ' ';
}
template <class T, class... Ts> void prn(const T &a, const Ts &...b) {
cout << a;
(cout << ... << (cout << ' ', b));
}
void pr() { cout << '\n'; }
#define N 10005
#define P 1000000007
#define Say(x) pr(x ? "Yes" : "No")
int n, m;
struct Bad {
int k;
vector<string> s;
int op;
} a[N];
int main() {
#ifndef ONLINE_JUDGE
freopen("admin.in", "r", stdin);
// freopen("admin.out", "w", stdout);
#endif
ios::sync_with_stdio(false), cin.tie(nullptr);
// cout << fixed << setprecision(20);
re(n);
auto split = [&](string ss) {
istringstream iss(ss);
string tmp;
vector<string> s;
while (getline(iss, tmp, '/')) {
if (!tmp.empty()) {
s.push_back(tmp);
}
}
return s;
};
auto check = [&](int k, vector<string> s) -> bool {
int i = 0, j = 0;
bool pre = 0;
if (a[k].op == 0) {
if (a[k].s.size() != s.size())
return 0;
F(i, 0, s.size() - 1) {
if (a[k].s[i] != s[i])
return 0;
}
return 1;
}
if (a[k].op == 1) {
if (a[k].s.size() != s.size())
return 0;
for (int i = 0, j = 0; i < a[k].s.size() && j < s.size(); i++, j++) {
if (a[k].s[i] == "*" && !pre) {
pre = 1;
} else {
if (a[k].s[i] != s[j])
return 0;
}
}
return 1;
}
if (a[k].s.size() - 1 > s.size())
return 0;
for (int i = 0, j = 0; a[k].s[i] != "**"; i++, j++) {
if (a[k].s[i] != s[j])
return 0;
}
for (int i = a[k].s.size() - 1, j = s.size() - 1; a[k].s[i] != "**"; i--, j--) {
if (a[k].s[i] != s[j])
return 0;
}
return 1;
};
F(i, 1, n) {
string ss;
re(a[i].k, ss);
a[i].s = split(ss);
for (auto j : a[i].s) {
if (j == "**")
a[i].op = 2;
else if (j == "*")
a[i].op = 1;
}
}
re(m);
while (m--) {
string ss;
re(ss);
auto s = split(ss);
int ans = -1;
F(i, 1, n) {
if (check(i, s)) {
ans = max(a[i].k, ans);
}
}
if (ans == -1)
pr("SAFE");
else
pr("ALERT:", ans);
}
return 0;
}