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

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

说明

为了举办全球网络搜索冠军赛,组织者需要限制访问某些地址。每个网络地址由服务器名和路径名组成。

服务器名由一到五个部分组成,每部分是由小写字母组成的非空字符串,部分之间用点号分隔。例如,aab.cdabacabaa.b.c.d.e 都是有效的服务器名。

路径名是一个字符串,可以为空,或者由一到五个部分组成,每部分以字符 / 开头,后跟一个或多个小写字母。例如,``、/a/aba/a/b/c/d/e 都是有效的路径名。

完整的地址是由服务器名和路径名拼接组成的。例如,aaba/d/f/g/ha.baba.caba/def/gc.d.e.f.g/a/b/c/d/e 都是有效的地址。

为了限制访问,组织者为每个地址准备了多个过滤器。过滤器和地址一样,也由服务器名和路径名两部分组成。

服务器过滤器是服务器名,前面可以加上 *.。如果服务器过滤器只是服务器名,那么它只能匹配该服务器名完全相同的地址。如果服务器过滤器是 *.<服务器名>,则它匹配所有以该服务器名结尾的地址。

路径过滤器是路径名,后面可以加上 /*。如果路径过滤器是单一的路径名 RR,它只能匹配完全相同的路径。如果路径过滤器是 R/R/*,它匹配所有以 RR 为前缀的路径。

一个地址匹配过滤器的条件是,它的服务器名必须匹配过滤器的服务器名,且它的路径名必须匹配过滤器的路径名。

筛选器及其相应地址的示例见下表。

筛选器 匹配地址示例
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

任务:编写程序,对于给定的过滤器和地址,判断每个地址匹配多少个过滤器。

输入格式

第一行输入两个整数:nn —— 过滤器数量,pp —— 子任务编号(0p30 \leq p \leq 3)。

接下来 nn 行,每行一个过滤器,格式与地址的服务器名和路径名相同。

接下来一行输入一个整数 kk —— 地址数量。

接下来 kk 行,每行一个地址。

输出格式

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

2 0
a.bb/c
bb/c/d
4
a.bb
bb/c/d
a.bb/c/d
bb/c
0
1
0
0
4 0
*.bb/c
*.bb/c/*
bb/c/*
bb/c/*
6
bb
bb/c
bb/c/d
a.bb
a.bb/c
a.bb/c/d

0
4
3
0
2
1

提示

示例说明

在这个示例中,过滤器有 a.bb/ca.bb/cbb/c/dbb/c/d,地址有 a.bba.bbbb/c/dbb/c/da.bb/c/da.bb/c/dbb/cbb/c。其中只有 bb/c/dbb/c/d 地址匹配过滤器 bb/c/dbb/c/d,其他的地址不匹配任何过滤器。

子任务评价与说明

子任务 1(27分)

1n1000,1k1000,p=11 \leq n \leq 1000, 1 \leq k \leq 1000, p = 1

所有过滤器都以 *. 开头并以 /* 结尾。

子任务 2(25分)

1n50000,1k50000,p=21 \leq n \leq 50 000, 1 \leq k \leq 50 000, p = 2

过滤器中没有 *

子任务 3(48分)

1n50000,1k50000,p=31 \leq n \leq 50 000, 1 \leq k \leq 50 000, p = 3

没有任何限制条件。

翻译来源:GPT 5.2。