此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后缀
然后更新其影响的字符串的方法,即区间更新,维护最大值,用线段树优化。
而其可以影响的字符串为其在fail树中的子树节点
此题一直MLE,调了一下午+晚上。最后发现。
(1)ac自动机中的节点开始直接初始化,应动态初始化(也终于理解了许多人那么做)
(2)还有用vector表示树边时,一开始初始clear,也会耗很多内存。
(3)线段树开始直接初始化CLR(smax, 0)CLR(cov, 0),由于数组比较大,内存耗较大
最后,ac自动机节点动态初始化,用链表模拟表示树边,线段树动态build,终于有MLE变成了wa
怒重敲,终于ac了
PS:一开始使用后缀数组ac的,数据水了。。。
不过ac自动机2s+,后缀数组8s+
ac自动机:
#pragma comment(linker, /STACK:1024000000,1024000000)
#include
#include
#include
#include
#include
#include
#include
#include
#include
后缀数组:
//#pragma warning (disable: 4786)
//#pragma comment (linker, /STACK:16777216)
//HEAD
#include
#include
#include
#include
#include
#include
#include
#include
#include