給出幾個由小寫字母構成的單詞,求它們最長的公共子串的長度。
任務輸入
檔案的第一行是整數 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 7using
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 當然我們現在一眼就可以看出來最長公...