Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 修改的最长公共子串_C++_Algorithm - Fatal编程技术网

C++ 修改的最长公共子串

C++ 修改的最长公共子串,c++,algorithm,C++,Algorithm,我正在使用后缀数组读取两个字符串之间最长的公共子字符串。我编写了一个程序来开发一个O(N)复杂度的字符串后缀数组 现在我想修改程序,找到两个字符串的所有最长公共子字符串。如何操作 例如: 让S1=xyzabc S2=abcxyz,这里的答案是最长公共子字符串的长度是3和{“abc”,“xyz”} 请帮忙 (假设我在数组SA[]中找到了后缀数组) void kasaiLCP(){ 对于(inti=0;i

我正在使用后缀数组读取两个字符串之间最长的公共子字符串。我编写了一个程序来开发一个O(N)复杂度的字符串后缀数组

现在我想修改程序,找到两个字符串的所有最长公共子字符串。如何操作

例如:
让S1=xyzabc S2=abcxyz,这里的答案是最长公共子字符串的长度是3和{“abc”,“xyz”}

请帮忙 (假设我在数组SA[]中找到了后缀数组)

void kasaiLCP(){
对于(inti=0;i0){
int j=SA[c[i]-1];
而(i+h0)-h;
}
}
此LCP实施是否正确?我的后缀数组是0索引的

对于S1=abcabc和S2=bc。 我的后缀数组SA[]=[6,3,0,7,4,1,8,5,2]

LCP数组be=[0,0,3,0,2,2,0,1,1]


对吗

创建
S1$S2
的通用后缀数组。使用RMQ设置高度数组,以查找O(1)中后缀的LCP。用它来自的字符串的编号标记每个后缀。通过SA,使用另一个字符串中最近看到的后缀计算每个后缀的LCA。您将拥有所有公共子字符串。找到其中最长的。如果你能实现一个在线性时间内构造后缀数组的算法,这应该是小菜一碟:)@NiklasB。请解释“使用RMQ设置一个高度数组,以查找O(1)中后缀的LCP”。请详细说明您想说什么。我不明白。@NiklasB。我经历过这一切,但这对我毫无帮助。你不需要这样做。您只需要SA中相邻后缀的LCP
void kasaiLCP () {
for (int i = 0; i < str.length(); ++i) c [SA [i]] = i;
LCP [0] = 0;
for (int i = 0, h = 0; i < str.length(); ++i) if (c[i] > 0) {
        int j = SA [c [i] - 1];
        while (i + h < str.length() && j + h < str.length() && str [i + h] == str [j + h]) ++h;
        LCP [c [i]] = h;
        if (h > 0) --h;
    }
}