当前位置:首页 > 字符串 > AC自动机 > 正文
SSOJ2762单词
1040+

题目大意:已知文章由n个单词组成,请问这些单词分别在文章中出现了多少次?

题目描述

原题来自:TJOI 2013

某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

输入

第一个一个整数 N,表示有多少个单词,接下来 N 行每行一个单词。

输出

输出 N 个整数,第 i 行的数字表示第 i 个单词在文章中出现了多少次。

提示

样例输入

3
a
aa
aaa

样例输出

6
3
1

对于全部数据,1N200,所有单词长度的和不超过 106,保证每个单词由小写字母组成。

解题思路

在AC自动机模板上做简单修改即可。

首先,打好AC自动机模板,在匹配的过程中,发现文章由单词n个单词组成,其实匹配移动的过程,就是Trie树的建立过程,因为单词之间是断开的,所以最远走到的位置,就是他在Trie树上的位置,所以代码第14行就是记录根到p节点的匹配次数加1。

接着处理包含关系,如果每次都暴力往前一个短一点的前缀更新,容易超时,我们可以利用广搜队列逆序,自下而上更新,即可统计出每个前缀被匹配的次数。

最后输出的时候,因为单词可能重复出现,所以不能计每个节点对应哪个单词的结束,而应记录每个单词的结束位置,输出时输出该位置的匹配数量即可。

程序实现

About

坚决不Copy代码!

本文标签:,,,,,,,,,

SSOJ2762单词:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!