SAM学习笔记

感觉自己现在学这个东西已经有点晚了,但是还是得学不是嘛?加油吧。

关于结构

首先我们需要明白的是 \(SAM\) 的结构具体对应的是什么意义。

我们需要引入 \(endpos\) 的概念。

endpos

关于 \(endpos\) ,我们定义 \(endpos(t)\) 表示子串 \(t\) 在原串 \(s\) 中出现时末尾字符的位置集合。

很明显,对于 \(s\) 的所有子串, \(endpos\) 是可能出现大量相同的,我们讲两个子串等价则他们的 \(endpos\) 集等价,即 \(endpos(t_1)=endpos(t_2)\) ,我们因此可以将所有子串分成若干个集合,每个集合中的元素的 \(endpos\) 均相同。

很明显,这个 \(endpos\) 有很多优美的性质。

如果一个子串 \(t_1\) 是子串 \(t_2\) 的后缀,则 \(endpos(t_1)\supseteq endpos(t_2)\)

这个东西的证明比较显然,我们就考虑如果这个如果在除了 \(t_2\) 后缀之外的地方出现了,那么它的 \(endpos\) 可能会更大,不然的话就是相同的。

如果两个子串 \(t_1\)\(t_2\)\(endpos\) 相同,那么必定一个是另一个的后缀,且作为的后缀的那个子串必然不在其余位置出现。

这个证明也很显然。

对于一个可能出现的 \(A=endpos(t)\) ,如果其存在的一个子串 \(t_1\) 符合 \(endpos(t_1)=A\) ,存在一个子串 \(t_2\) 符合 \(endpos(t_2)=A\) ,且 \(|t_1|\le |t_2|\) ,那么对于长度 \(len\in[|t_1|,|t_2|]\)\(t_2\) 的后缀,其 \(endpos\) 均为这个集合 \(A\)

这个东西结合一下前面的两个性质就可以证明了。

关于 SAM 的结构

\(SAM\) 上的点即是我们刚刚介绍的 \(endpos\) ,表示所有符合这个 \(endpos\) 的子串,边呢即是从一个 \(endpos\) 到另一个 \(endpos\) 的转移。

关于节点个数的复杂度呢,后面再构建的时候会一并证明。

同时 \(SAM\) 中也有一种非常重要的边,叫做后缀 \(Link\)

这个东西我感觉才是 \(SAM\) 的精髓?

就是前面已经证明过了,对于一个 \(endpos\) 节点,它对应的是一系列长度连续的后缀串(可能出现在多个位置),我们定义 \(L\) 为这个节点的对应最小长度,\(R\) 为这个节点的最长长度,那么这个节点的后缀 \(Link\) 指向的节点就是其对应长度为 \(R=L-1\) 且其中对应字符都是当前节点的后缀的一个,容易证明,后缀 \(Link\) 指向的节点的 \(endpos\) 真包含当前节点的 \(endpos\) ,因为如果相同的话就会他们就会是一个节点了。

由于每一个点只会有一个 \(Link\) ,而且易证不会出现环,所以所有后缀 \(Link\) 构成的就是一棵树。

关于构建

这个东西比较搞。

设我们现在加入的最后一个字符为 \(c\) ,我们考虑加入前 \(endpos=\{n\}\) 的节点为 \(lst\) ,我们首先应该创造一个新的状态 \(now\) ,表示 \(endpos=\{n+1\}\) 的节点。

然后我们考虑跳 \(lst\)\(Link\) ,因为这些点对应的子串后加一个 \(c\) 均是当前 \(now\) 串对应的子串的后缀。我们考虑不停地跳 \(Link\) ,如果当前节点没有 \(c\) 的转移,那么就将 \(c\) 的转移连向 \(now\) ,直到存在 \(c\) 的转移或跳到不存在的节点。

如果跳到了不存在的节点就可以直接停下了,否则我们令当前这个存在 \(c\) 转移的节点名为 \(u\) ,它对应的转移为 \(v\)

接下来我们需要分类讨论,如果 \(R(u)+1=R(v)\) ,那么很好,我们直接将 \(now\)\(Link\) 连向它 \(v\) 就可以了。

但是如果 \(R(u)+1<R(v)\) (需要注意,这里是不会大于的,具体可以自己思考一下),那么我们需要将 \(v\) 分裂开来,因为其对应子串中长度大于 \(R(u)+1\) 的部分其实不存在于我们 \(now\) 所对应的子串的后缀中,它只是其他位置的子串,因为如果是后缀的话,其必然会在之前就被我们通过跳 \(lst\)\(Link\) 而找到。

所以此时我们只需要将 \(v\) 分成大于 \(R(u)+1\) 的部分和小于等于的部分,其中大于的部分的 \(Link\) 根据定义,是需要连向较小的一个的,然后更改一下 \(u\) 上面的转移向 \(v\) 的点的转移,转移向小于等于的部分,这也是根据定义来的。

然后重复上述步骤即可。

An empty street

空旷的街

An empty house

空荡的房间

A hole inside my heart

我的心也空空如也

I'm all alone

现在只剩下我一个人

The rooms are getting smaller

房间却狭小起来

I wonder how

我不知道它们现在如何

I wonder why

我不知道它们为什么消失不见

I wonder where they are

以及它们究竟去往何处

The days we had

那些我们曾经一起度过的日子

The songs we sang together

那些我们一起哼唱过的歌

Oh yeah

oh yeah

And all my love

噢,我的所爱

I'm holding on forever

我会一直坚持下去

Reaching for a love that seems so far

去寻求那即使是看起来遥不可及的爱

So I say a little prayer

因此我低声祷告

And hope my dreams will take me there

哪怕只是在梦里实现

Where the skies are blue to see you once again, my love

让我到达那个天空湛蓝,能够再次见到你的地方

Over seas from coast to coast

哪怕翻山越岭,哪怕漂洋过海

To find a place I love the most

也要去寻找那个我最爱的地方

Where the fields are green to see you once again, my love

在洋溢着麦草气息的田野里,再次见到你的地方

I try to read

我试着让自己读些东西

I go to work

试着开始工作

I'm laughing with my friends

也和朋友们一起开怀大笑

But I can't stop to keep myself from thinking Oh no

但我还是阻止不了想你的念头

I wonder how

我不知道它们现在如何

I wonder why

我不知道它们为什么消失不见

I wonder where they are

以及它们究竟去往何处

The days we had

那些我们曾经一起度过的日子

The songs we sang together Oh yeah

那些我们一起哼唱过的歌

And all my love

但是,我的所爱

I'm holding on forever

我会一直坚持下去

Reaching for a love that seems so far

去寻求那即使是看起来遥不可及的爱

So I say a little prayer

因此我低声祷告

And hope my dreams will take me there

哪怕只是在梦里实现

Where the skies are blue to see you once again, my love

让我到达那个天空湛蓝,能够再次见到你的地方

Over seas from coast to coast

哪怕翻山越岭,哪怕漂洋过海

To find a place I love the most

也要去寻找那个我最爱的地方

Where the fields are green to see you once again

在洋溢着麦草气息的田野里,再次见到你的地方

To hold you in my arms

我会拥你入怀

To promise you my love

我会在你耳边轻声承诺

To tell you from the heart

向你坦诚

You're all I'm thinking of

你就是我一直以来的所思所想

I'm reaching for a love that seems so far

我在寻求那即使是看起来遥不可及的爱

So I say a little prayer

因此我低声祷告

And hope my dreams will take me there

哪怕只是在梦里实现

Where the skies are blue to see you once again, my love

让我到达那个天空湛蓝,能够再次见到你的地方

Over seas from coast to coast

哪怕翻山越岭,哪怕漂洋过海

To find a place I love the most

也要去寻找那个我最爱的地方

Where the fields are green to see you once again, my love

在洋溢着麦草气息的田野里,再次见到你的地方

Say a little prayer

因此我低声祷告

(My sweet love) Dreams will take me there

哪怕只是在梦里实现

Where the skies are blue to see you once again

让我到达那个天空湛蓝,能够再次见到你的地方

Over seas from coast to coast

哪怕翻山越岭,哪怕漂洋过海

To find a place I love the most

也要去寻找那个我最爱的地方

Where the fields are green to see you once again

在洋溢着麦草气息的田野里,再次见到你的地方

My love

我的爱

posted @ 2021-03-24 22:31  Point_King  阅读(65)  评论(1编辑  收藏  举报