P15526 [ROIR 2015 Day 1] search 网络搜索冠军

题目描述

为了举办全球网络搜索冠军赛,组织者需要限制访问某些地址。每个网络地址由服务器名和路径名组成。 服务器名由一到五个部分组成,每部分是由小写字母组成的非空字符串,部分之间用点号分隔。例如,`a`、`ab.cd`、`abacaba` 和 `a.b.c.d.e` 都是有效的服务器名。 路径名是一个字符串,可以为空,或者由一到五个部分组成,每部分以字符 `/` 开头,后跟一个或多个小写字母。例如,``、`/a`、`/aba` 和 `/a/b/c/d/e` 都是有效的路径名。 完整的地址是由服务器名和路径名拼接组成的。例如,`a`、`aba/d/f/g/h`、`a.b`、`aba.caba/def/g` 和 `c.d.e.f.g/a/b/c/d/e` 都是有效的地址。 为了限制访问,组织者为每个地址准备了多个过滤器。过滤器和地址一样,也由服务器名和路径名两部分组成。 服务器过滤器是服务器名,前面可以加上 ` *.`。如果服务器过滤器只是服务器名,那么它只能匹配该服务器名完全相同的地址。如果服务器过滤器是 ` *.`,则它匹配所有以该服务器名结尾的地址。 路径过滤器是路径名,后面可以加上 ` /*`。如果路径过滤器是单一的路径名 $R$,它只能匹配完全相同的路径。如果路径过滤器是 $R/*$,它匹配所有以 $R$ 为前缀的路径。 一个地址匹配过滤器的条件是,它的服务器名必须匹配过滤器的服务器名,且它的路径名必须匹配过滤器的路径名。 筛选器及其相应地址的示例见下表。 |筛选器 |匹配地址示例 | |:--------:|:--------:| |`ab.c/d/e`|`ab.c/d/e`| |`*.a` |`a` `ax.a` `efg.a`| |`*.a/b/c` |`a/b/c` `x.a/b/c` e.fg.a/b/c`| |`x.yz/a/*`|`x.yz/a` `x.yz/a/b/c` `x.yz/a/xyz`| |`*.a/*` |`a` `x.a` `e.fg.a` `a/b/c` `x.a/ddd/c` `e.fg.a/b/c/g/haha/i`| |`*.a/b/c/*`|`a/b/c` `x.a/b/c` `e.fg.a/b/c` `a/b/c/xxx` `e.fg.a/b/c/d/e/f`| **任务**:编写程序,对于给定的过滤器和地址,判断每个地址匹配多少个过滤器。

输入格式

第一行输入两个整数:$n$ —— 过滤器数量,$p$ —— 子任务编号($0 \leq p \leq 3$)。 接下来 $n$ 行,每行一个过滤器,格式与地址的服务器名和路径名相同。 接下来一行输入一个整数 $k$ —— 地址数量。 接下来 $k$ 行,每行一个地址。

输出格式

输出文件应包含 $k$ 个整数,每个整数表示一个地址匹配的过滤器数量。

说明/提示

### 示例说明 在这个示例中,过滤器有 $a.bb/c$ 和 $bb/c/d$,地址有 $a.bb$、$bb/c/d$、$a.bb/c/d$ 和 $bb/c$。其中只有 $bb/c/d$ 地址匹配过滤器 $bb/c/d$,其他的地址不匹配任何过滤器。 ### 子任务评价与说明 #### 子任务 1(27分) $1 \leq n \leq 1000, 1 \leq k \leq 1000, p = 1$ 所有过滤器都以 `*.` 开头并以 `/*` 结尾。 #### 子任务 2(25分) $1 \leq n \leq 50 000, 1 \leq k \leq 50 000, p = 2$ 过滤器中没有 `*`。 #### 子任务 3(48分) $1 \leq n \leq 50 000, 1 \leq k \leq 50 000, p = 3$ 没有任何限制条件。 翻译来源:GPT 5.2。