P12875 [蓝桥杯 2025 国 Python A] 网络流量监控

题目背景

2025-06-16 21:45 根据题意和样例,目前洛谷数据的 $q_i$ 中不带 `*` 通配符。如果蓝桥杯官方数据中证实带有通配符,那么我们会修改本题数据。

题目描述

网络安全团队需要开发一个系统来监控和检测恶意网络流量。他们收集了一系列已知的恶意请求路径模式,每个模式都有一个对应的风险等级。你的任务是实现一个算法,检测给定的网络请求路径是否匹配这些模式,并返回匹配模式中最高的风险等级。下面是恶意请求路径的相关描述: ### 路径格式 - 路径由斜杠(/)分隔的若干段组成,如 `/api/users/profile`。 - 路径总是以斜杠(/)开头。 - 路径中的每一段可以是由小写英文字母和数字组成的非空字符串。当路径为路径模式时,路径中的一段还可以是通配符 `*` 或 `**`。 ### 通配符规则 - 通配符包括单通配符(`*`)和双通配符(`**`),只能是路径模式中的完整一段。一个路径中最多有一段通配符,不能出现两个单通配符,不能出现两个双通配符,也不能同时出现单通配符和双通配符。 - 单通配符(`*`)用于匹配路径中的任意一段。 - 例如:`/api/*/delete` 可以匹配 `/api/users/delete` 或 `/api/files/delete`,但不能匹配 `/api/admin/users/delete`。 - 双通配符(`**`)用于匹配路径中的零段或连续多段。 - 例如:`/api/admin/**` 可以匹配 `/api/admin`、`/api/admin/users` 或 `/api/admin/users/profile`。 - 例如:`/static/**/execute` 可以匹配 `/static/execute`、 `/static/js/execute` 或 `/static/css/js/execute`。 ### 风险评估 - 每个恶意路径模式都有一个风险等级。 - 如果一个请求同时匹配多个模式,返回风险等级最高的。 - 如果不匹配任何模式,返回 `SAFE`。 你需要实现一个算法,给定恶意请求路径模式集合和一系列网络请求路径,判断每个网络请求是否触发警报,并且返回触发的最高风险等级。

输入格式

输入的第一行包含一个正整数 $n$ ,表示恶意路径模式的数量 接下来 $n$ 行,每行包含一个整数 $l_i$ 和一个字符串 $p_i$ ,用一个空格分隔,表示一个恶意请求路径模式,$l_i$ 表示风险等级,$p_i$ 表示路径模式。 接下来一行包含一个整数 $m$ ,表示要检测的网络请求数量。 接下来 $m$ 行,每行包含一个字符串 $q_i$ ,表示一个网络请求路径。

输出格式

对于每个网络请求路径,输出一行,包含检测结果。如果触发警报,输出 `ALERT: [风险等级]`;如果没有触发警报,输出 `SAFE`。

说明/提示

**【样例说明】** 1. `/api/users/profile` - 不匹配任何模式,所以是 SAFE。 2. `/api/admin/users` - 匹配 `/api/admin/**`,风险等级 80。 3. `/api/config/delete` - 匹配 `/api/*/delete`,其中 `*` 匹配 `config`,风险等级 60。 4. `/dev/config/system` - 匹配 `/*/config/system`,其中 `*` 匹配 `dev`,风险等级 75。 5. `/static/js/execute` - 匹配 `/static/**/execute`,其中 `**` 匹配 `js`,风险等级 50。 6. `/api/users/123/password` - 匹配 /`api/users/*/password`,其中 `*` 匹配 `123`,风险等级 90。 7. `/static/css/js/execute` - 匹配 `/static/**/execute`,其中 `**` 匹配 `css/js`,风险等级 50。 8. `/api/admin` - 匹配 `/api/admin/**`,其中 `**` 匹配空(0 个段),风险等级 80。 **【评测用例规模与约定】** 对于 $20\%$ 的评测用例,$1 \leq n \leq 10, 1 \leq m \leq 10$; 对于 $40\%$ 的评测用例,$1 \leq n \leq 100, 1 \leq m \leq 100$; 对于 $60\%$ 的评测用例,$1 \leq n \leq 1000, 1 \leq m \leq 1000$; 对于所有评测用例,$1 \leq n \leq 10,000$,$1 \leq m \leq 1000$,$1 \leq l_i \leq 50000$,$1 \leq |p_i| \leq 50$,$1 \leq |q_i| \leq 50$。