Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的。
接下来会发生q个操作,操作有两种形式:
“1 P”,Bob往自己的集合里添加了一个字符串P。
“2 x”,Alice询问Bob,集合T中有多少个字符串包含串S_x。(我们称串A包含串B,当且仅当B是A的子串)
Bob遇到了困难,需要你的帮助。
先拿到所有的S_i串,建Trie树,构造AC自动机。
每次向T中加入一个新串,就扔进自动机走一遍,标记所有经过的结点。
在Fail树上按DFS序访问所有visit结点,每个结点+1,相邻结点-1。
询问S_x串的话,直接求EndPos(S_x)的子树和即可,这个就需要DFS序+线段树(或树状数组)支持一下。
@Author: YouSiki
原文:http://www.cnblogs.com/yousiki/p/6412218.html