POI2000 最長公共子串

2022-05-11 11:57:28 字數 1150 閱讀 1162

給出幾個由小寫字母構成的單詞,求它們最長的公共子串的長度。

任務輸入

檔案的第一行是整數 n,1<=n<=5,表示單詞的數量。接下來n行每行乙個單詞,只由小寫字母組成,單詞的長度至少為1,最大為2000。

輸出:僅一行,乙個整數,最長公共子串的長度。

樣例輸入:

3

abcb

bcaacbc

樣例輸出:

2

題解:

顯然所有的串先合併,然後用不同符號間隔

最後二分答案,找到high[i]大於答案x的 並不斷往後擴充套件 如果滿足所有子串都覆蓋到即滿足

為什麼我總喜歡把 l開成char?

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

using

namespace

std;

8const

int n=20005;9

int s[n],n=0,k,tmp[n],sa[n],rk[n],high[n],color[n],m,l[6];char s[6][2005

];10

bool comp(int i,int

j)16

void

getsa()

20for(k=1;k<=n;k<<=1)25

}26void

gethight()34}

35void prework(int

m)42}43

bool d[8

];44

bool check(int

lim)57}

58return

false;59

}60intmain()

6173

getsa();gethight();prework(m);

74int l=0

,mid,ans;

75while(l<=r)

80 printf("

%d\n

",ans);

81return0;

82 }

POI2000 最長公共子串

求多個串的最長公共子串。聽說如果會 sa m 的話這題就很簡單了 然而我只會用 sa 做,具體做法是先用不同的分隔符把字串接成乙個串 然後還是按 he ight i 從大到小將 i 的集合與 i 1的集合合併 對每個集合維護乙個 se t i 用來記錄 i 的集合中出現了哪些字串的子串 注意 se ...

最長公共子串行 最長公共子串

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