題目鏈結:
題目大意: 求兩個串的最長公共子串,注意子串是連續的,而子串行可以不連續。
解題思路:
字尾陣列解法是這類問題的模板解法。
對於n個串的最長公共子串,這要把這些串連在一起,中間用"$"這類的特殊符號分隔一下。
先求字尾陣列,再求最長公共字首,取相鄰兩個且屬於不同串的sa的最大lcp即可。
原理就是:這樣把分屬兩個串的lcp都跑了一遍,也就是相當於把所有子串走了一遍,
只不過走這些子串是經過層層預處理過的。
下面提供乙個使用的string模板,稍微穩定點。
#include "cstring
"#include
"cstdio
"#include
"string
"#include
"iostream
"using
namespace
std;
#define maxn 30000
struct
suffix
int cmp(int *r,int a,int b,int l)
void
build()
n--;
}void
lcp()
}int lcs(string s1,string
s2)
};int
main()
}
13557348
neopenx
2217
accepted
1060k
32ms
c++2109b
2014-10-23 10:35:07
POJ 2217 Secretary 字尾陣列
題目大意 計算兩個字串的最長的公共字串字串的長度。思路分析 將兩個串合併起來。然後直接跑字尾陣列求出height 然後就可以直接掃瞄一次height 加個是不是在乙個串中的判斷就可以了。include include include include define maxn 200005 using ...
字尾陣列 POJ 2217 Secretary
題目鏈結 題意 求兩個字串的最長公共子串 分析 做法是構造新的串是兩個串連線而成,中間用沒有出現的字元隔開 因為這樣才能保證s的字尾的公共字首不會跨出乙個原有串的範圍 即news s t。對其求sa陣列和height陣列,取最小值的height i 且兩個字尾串屬於不同的字串。include inc...
字尾陣列 LCP(最長公共字首)
sa sa陣列儲存的是乙個1 n的全排列,儲存的是 將所有字尾按字典序排序後,串在原串中的位置。即有suffix sa i suffix sa i 1 rank rank陣列儲存的是 suffix i 在所有字尾中按字典序排序的 名次 總結 字尾陣列是 排第幾的是誰?名次陣列是 你排第幾?lcp i...