SCOI 2012 喵星球上的点名 后缀数组+莫队

Description

a180285幸运地被选做了地球到喵星球的留学生。他发现喵星人在上课前的点名现象非常有趣。 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成。喵星球上的老师会选择M个串来点名,每次读出一个串的时候,如果这个串是一个喵星人的姓或名的子串,那么这个喵星人就必须答到。 然而,由于喵星人的字码过于古怪,以至于不能用ASCII码来表示。为了方便描述,a180285决定用数串来表示喵星人的名字。

现在你能帮助a180285统计每次点名的时候有多少喵星人答到,以及M次点名结束后每个喵星人答到多少次吗?


Input
现在定义喵星球上的字符串给定方法:
先给出一个正整数L,表示字符串的长度,接下来L个整数表示字符串的每个字符。
输入的第一行是两个整数N和M。
接下来有N行,每行包含第i 个喵星人的姓和名两个串。姓和名都是标准的喵星球上的
字符串。

接下来有M行,每行包含一个喵星球上的字符串,表示老师点名的串。


Output
对于每个老师点名的串输出有多少个喵星人应该答到。

然后在最后一行输出每个喵星人被点到多少次。


思路:

本来是个AC自动机裸题,但是由于字符集很大,所以AC自动机要套个map,比较慢(不过好像可以过)。

于是就作死地写了个后缀数组。把所有字符串丢进一个母串跑后缀数组,用10001隔开。对于每个模式串(即老师点名的串),我们可以二分出它在后缀数组中的匹配区间(即与某个排名区间内的后缀的LCP大于等于它的自身串长)。

接下来考虑第一问,这相当于查询每个模式串的匹配区间内有多少个喵星人,他们姓名的某一个后缀在该区间内出现过。莫队一发即可。

对于第二问,我们不妨对于每一个姓名的后缀单独计算其贡献,但是需要减掉重复的部分。我们可以将每个匹配区间的左右端点排序,然后按排名扫一遍后缀数组,同时对于每一个姓名记录其后缀上一次出现的位置。若遇到一个左端点,以其左端点为关键字加入树状数组&

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值