我们可以使用带后缀链接的因子oracle(
paper here)来计算多个字符串的最长公共子字符串吗?这里,substring表示原始字符串的任何部分.例如,“abc”是“ffabcgg”的子串,而“abg”则不是.
我找到了一种方法来计算两个字符串s1和s2的最大长度公共子串.它通过使用不在其中的字符连接两个字符串来工作,例如’$’.然后,对于长度为i> = | s1 |的连接字符串s的每个前缀在图2中,我们计算其LRS(最长重复后缀)长度lrs [i]和sp [i](其LRS的第一次出现的结束位置).最后,答案是
max{lrs[i]| i >= |s1| + 2 and sp[i] <= |s1|}
我编写了一个使用这种方法的C程序,当| s1 |时,我的笔记本电脑可以在200ms内解决问题| S2 | < = 200000,使用因子oracle.
s1 = 'ffabcgg'
s2 = 'gfbcge'
s = s1+'$'+s2
= 'ffabcgg$gfbcge'
p: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
s: f f a b c g g $g f b c g e
sp: 0 1 0 0 0 0 6 0 6 1 4 5 6 0
lrs:0 1 0 0 0 0 1 0 1 1 1 2 3 0
ans = lrs[13] = 3
我知道这两个问题都可以使用后缀数组和后缀树来高效解决,但我想知道是否有一个方法使用因子oracle来解决它.我对此感兴趣,因为oracle因素易于构造(30行C,后缀数组需要大约60,后缀树需要150),并且运行速度比后缀数组和后缀树快.
您可以在this OnlineJudge中测试第一个问题的方法,在here中测试第二个问题.