字符串小结

1.kmp 和 AC 自动机

AC自动机可以理解为多个串之间的kmp,具体还是非常简单。

首先建出 trie 树,接着你要做的就是将一段后缀连向与之相同的前缀,这样就构成了 fail tree。

具体应用:

1.求多个字符串分别在模式串出现的次数,在fail tree上解决即可。

2.做动态转移方程。

2. SA

重点在后缀排序,可以通过倍增以及基数排序解决。

\(height_i\):排名 \(i\) 的后缀与排名 \(i-1\) 的后缀的最长相同前缀。

性质: \(height_{i} \ge height_{i-1} +1\)

证明:鸽。

3 .SAM

首先给出相关定义:

\(endpos(x)\):一些在原串中出现的(末尾)位置完全相同的等价类 \(x\)

性质:一个等价类中显然是一串连续的后缀。

\(link(x)\):等价类中最短的那一个串的开头再缩减一次后得到的不同的等价类,这样构成了一个tree。

\(min/max len(x)\):等价类中最长的串和最短的串的长度。

具体实现:考虑已完成了原串 \(s_{1...i}\) 的 SAM,加入 \(i+1\)。首先显然有一些串必然 \(endpos\) 只有 \(i+1\)。然后一直往上面找,直到找到第一个等价类加上 \(s_{i+1}\) 能使以 \(i+1\) 为后缀的一段串出现在这一个等价类。

分成两种情况:

  1. \(maxlen_x + 1 =maxlen_y\) 直接加上 \(i+1\) 这一个元素即可。
  2. 不同的话将 \(y\) 这一个等价类拆成两个。

转移数和状态数都为 \(O(n)\)

证明:鸽。

好用就行了

例题:

传送门

这就一个 SAM 就行了,看到以 \(l\) 为限制,那就倒着跑一遍 SAM,然后将询问离线下来做就完了,感觉自己写的巨抽象,写了一个 \(log^3\),用了 SEGBIT 和 BIT 和树剖。

好像本质不同子串个数这道题改一改就过了,感觉是真的板

posted @ 2024-01-27 16:44  ~Cyan~  阅读(46)  评论(0)    收藏  举报