#11T了

P3966 [TJOI2013] 单词

az,在询问时暴力跳 fail 边是不行的,复杂度最坏是 $O(\sum|S_i|\times n)$ 的,因为可以每个点都跳一边全部的 fail 边,建议用AC自动机+拓扑排序。
by C_liar @ 2022-09-29 11:01:40


大概思想是,把每个点向 fail 指针指向的点连一条边,形成一个DAG(只有一条出边,易证),在匹配时不再暴力跳全部的 fail 边,而是在这个点处加一个次数,表示它和它指向的节点(也就是fail,fail->fail,fail->fail->...)都要加1次出现次数。最后来一次拓扑排序,统计次数,更新答案,复杂度是正确的,$O(\sum|S_i|+n)$。 (二次加强模板的题解区应该有,可以自己看)
by C_liar @ 2022-09-29 11:09:14


QwQ,%东区大佬%%%
by C_liar @ 2022-09-29 11:10:57


@[C_liar](/user/663681) 欧克欧克懂了,%%%大佬您太巨了
by 凤年 @ 2022-10-02 19:06:18


|