POJ 2217 字尾陣列 最長公共子串

2021-09-08 10:29:25 字數 910 閱讀 3372

題目鏈結

題目大意: 求兩個串的最長公共子串,注意子串是連續的,而子串行可以不連續。

解題思路

字尾陣列解法是這類問題的模板解法。

對於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...