POI2000 最長公共子串

2021-07-05 03:41:41 字數 1477 閱讀 3628

求多個串的最長公共子串。

聽說如果會 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 當然我們現在一眼就可以看出來最長公...