正题
直接将所有串的后缀自动机建出来,要找i和i+1的后前缀公共部分时,就将i+1的所有前缀打标记,用i来倍增找标记,标记可能要dfs序来维护,所以是两个log,如果想寻求常数优化,可以试试树剖.
做kmp,记录下每个位置匹配到T串的位置,用链表来维护断裂即可.
求完所有的nex数组以后暴力找最小的border就行,记住找完之后要将最小border记下来,否则复杂度不对
和S题差不多,在ACAM上记录位置就可以了,用链表来维护断裂.
把S和T一起建ACAM,然后给S串对应的链+1,统计子树和即可.
将ACAM建出来后,在上面暴力Dp即可.
把ACAM建出来,然后就是一个三维Dp,第一维表示在那个点,第二维表示是否压着上界,第三维表示前缀是否全为0
离线即可,每次询问相当于多个点到根之和,这个可以转化为子树加,单点求值,dfs序求出来差分一下树状数组就可以,删除相当于子树-1,添加相当于子树+1.
先把所有串插入,用线段树合并来维护下标为i的出现了多少次,询问就是直接去对应点看看下标为i的权值就可以,时间复杂度一个log
当然如果你不想写线段树合并也可以,直接把询问排序然后树状数组来维护子树和就可以了.
把ACAM建出来之后,若一个点是病毒结尾,那么子树也是不合法的,将标记下传之后,从根dfs不经过病毒结尾找环即可.
CF1202E You Are Given Some Strings...
我们先考虑对于t的每个前缀,能使多少个串与其前缀的后缀匹配,这个把ACAM建出来之后让t上去跑,跑到一个位置,这个点到根的标记总和就是当前答案.如果我们知道对于每个后缀,能使多少个串与这个后缀的前缀匹配,那么就可以把他们拼起来了.这个问题显然可以把所有串都反过来,转化为第一行的同问题.