但是字符串的长度达到了 1e6, 所以必须采用 O(len(S))的SAM构造算法. 本文的目的就是学习SAM的线性时间构造算法.
和后缀树一样, 我们打算采用增量的观点来构造SAM....所谓增量的观点就是每次读入一个字符. 则会新产生一些要识别的后缀. 然后我们就必须对现有的SAM进行改造. 最终等到所有的字符都读完之后, 整个字符串的SAM就构造好了....所以SAM的构造过程是每次新读入一个字符S[i+1], 则新产生的前缀是S[1,..,i+1], 而它的所有
后缀是S[1,..,i+1],S[2,..,i+1],......,S[i,i+1],S[i+1] 这i+1个后缀. 我们每次升级改造SAM其实就是
要保证升级改造之后, 这i+1个后缀在SAM中能被识别. 或者说这i+1个后缀中任何一个都能找到一个节点作为归属....但是我们可以断言每次升级改造至少会诞生一个新的节点, 因为S[1,...,i+1]比当前任何前缀都要长.
它不可能属于任何一个既有节点.