loj2278. 「HAOI2017」字符串

2278. 「HAOI2017」字符串

给出一个字符串 $ s $ 和 $ n $ 个字符串 $ p_i $,求每个字符串 $ p_i $ 在 $ s $ 中出现的次数。注意这里两个字符串相等的定义稍作改变。

给定一个常数 $ k $,对于两个字符串 $ a, b $,如果 $ a = b $,那么满足:

1. $ |a| = |b| $;
2. 对于所有 $ a_i eq b_i $ 以及 $ a_j eq b_j $,满足 $ |i-j| < k $。

如果 $ |a| = |b| le k $,那么认为 $ a = b $。


写在前面:注意!!这题我还没有调出来!

因为这是一道多模板串题,我们考虑AC自动机。

它的要求相当于中间可以有一段长度为k-1的不匹配,其他都要匹配。

那么我们吧所有p的正串建AC自动机,反串也建AC自动机。

对于一个节点x,假设它匹配到了某个串的第j位,对应的反串应该要匹配那个串的后j+k+1位。

那么我们记录下反串j+k+1的节点是哪一个,当成询问挂在x上。

我们在把s拿去跑AC自动机,同样把对应的j与j+k+1记录下来。

统计的时候相当于把j+k+1的位置+1,询问子树和。

有一个容斥我没有想的很清楚,先咕着

原文地址:https://www.cnblogs.com/liankewei/p/12247586.html