求多個串的最長公共子串。
聽說如果會 sa
m 的話這題就很簡單了
然而我只會用 sa
做,具體做法是先用不同的分隔符把字串接成乙個串
然後還是按 he
ight
[i] 從大到小將
i 的集合與 i−
1的集合合併
對每個集合維護乙個 se
t[i]
,用來記錄
i 的集合中出現了哪些字串的子串 (注意 se
t[i]
也是乙個集合)
當存在 se
t[i]
為全集時,就得到最長公共子串了。
時間複雜度: o(
∑l∗log∑l
)
//poi 2000
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
template
void read(num &x)
template
void write(num x)
while(sl) putchar(s[--sl]);
}const
int maxn = 1e4 + 20, maxt = 7, slen = 2005;
int t, n;
char s[maxt][slen], str[maxn];
int in[maxn];
std::pair add[maxn];
int sa[maxn], rank[maxn];
int c[maxn], height[maxn];
intset[maxn], fa[maxn];
void make_sa(int m)
}void make_height()
}void init()
n += l + 1;
str[n] = '$' + i;
in[n] = -1;
}make_sa(256), make_height();
}int find(int x)
bool gather(int x,int y)
int sovle()
for(int i = 1; i < n; i++)
add[i] = std::make_pair(height[i + 1], i + 1);
std::sort(add + 1, add + n);
for(int i = n - 1; i >= 1; i--)
return0;}
int main()
POI2000 最長公共子串
給出幾個由小寫字母構成的單詞,求它們最長的公共子串的長度。任務輸入 檔案的第一行是整數 n,1 n 5,表示單詞的數量。接下來n行每行乙個單詞,只由小寫字母組成,單詞的長度至少為1,最大為2000。輸出 僅一行,乙個整數,最長公共子串的長度。樣例輸入 3 abcb bcaacbc樣例輸出 2 題解 ...
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...