习题归纳:KMP,ACAM的也许不是一句话题解

正题

      CF1200E Compress Words

      直接将所有串的后缀自动机建出来,要找i和i+1的后前缀公共部分时,就将i+1的所有前缀打标记,用i来倍增找标记,标记可能要dfs序来维护,所以是两个log,如果想寻求常数优化,可以试试树剖.

      [USACO15FEB]Censoring S

      做kmp,记录下每个位置匹配到T串的位置,用链表来维护断裂即可.

      [POI2006]OKR-Periods of Words

      求完所有的nex数组以后暴力找最小的border就行,记住找完之后要将最小border记下来,否则复杂度不对

      [USACO15FEB]Censoring G

      和S题差不多,在ACAM上记录位置就可以了,用链表来维护断裂.

      [TJOI2013]单词

      把S和T一起建ACAM,然后给S串对应的链+1,统计子树和即可.

      [USACO12JAN]Video Game G      

扫描二维码关注公众号,回复: 11624947 查看本文章

      将ACAM建出来后,在上面暴力Dp即可.

      [SDOI2014] 数数

      把ACAM建出来,然后就是一个三维Dp,第一维表示在那个点,第二维表示是否压着上界,第三维表示前缀是否全为0

      CF163E e-Government

      离线即可,每次询问相当于多个点到根之和,这个可以转化为子树加,单点求值,dfs序求出来差分一下树状数组就可以,删除相当于子树-1,添加相当于子树+1.

      CF1207G Indie Album

      先把所有串插入,用线段树合并来维护下标为i的出现了多少次,询问就是直接去对应点看看下标为i的权值就可以,时间复杂度一个log

      当然如果你不想写线段树合并也可以,直接把询问排序然后树状数组来维护子树和就可以了.

      [POI2000]病毒

      把ACAM建出来之后,若一个点是病毒结尾,那么子树也是不合法的,将标记下传之后,从根dfs不经过病毒结尾找环即可.

      CF1202E You Are Given Some Strings...

      我们先考虑对于t的每个前缀,能使多少个串与其前缀的后缀匹配,这个把ACAM建出来之后让t上去跑,跑到一个位置,这个点到根的标记总和就是当前答案.如果我们知道对于每个后缀,能使多少个串与这个后缀的前缀匹配,那么就可以把他们拼起来了.这个问题显然可以把所有串都反过来,转化为第一行的同问题.

      

猜你喜欢

转载自blog.csdn.net/Deep_Kevin/article/details/108474244