學習鏈結
題意:題目的本質就是求輸入的相鄰的兩個串的最長公共字串,有sa來解求得height陣列,然後用rmq演算法查詢。
解題思路:sa模板 + st模板
**如下:
#include#include#include#include#include#include#define n 100005
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using namespace std;
char s[n];
int wa[n],wb[n],wv[n],ws[n],r[n],sa[n];//sa的有效範圍[0,n]
int cmp(int *r,int a,int b,int l)
void da(int n,int m)//n為字串的長度加1,因為在使用倍增演算法前在原字串後面加乙個0
{ int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i=0;i--) sa[--ws[x[i]]]=i;
for(j=1,p=1;p=j) y[p++]=sa[i]-j;
for(i=0;i=0;i--) sa[--ws[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i
求最長公共字首 字尾陣列 hdu1403
vj鏈結 給兩個字串,求最長公共子串,多組資料,長度1e5 利用字尾陣列的性質,把兩個串連起來,找最大的滿足公共串部分分別在兩個字串裡的height。include include include include const int maxn 2e5 7 using namespace std 比較...
字尾陣列求最長公共子串 POJ 2774
根據羅的 兩個串的中間要加乙個ascii碼比任何字母都小的字元 最長公共子串 pku2774,ural1517 給定兩個字串a 和b,求最長公共子串。演算法分析 字串的任何乙個子串都是這個字串的某個字尾的字首。求a 和b 的最長公共子串等價於求a 的字尾和b 的字尾的最長公共字首的最大值。如果列舉a...
字尾陣列 LCP(最長公共字首)
sa sa陣列儲存的是乙個1 n的全排列,儲存的是 將所有字尾按字典序排序後,串在原串中的位置。即有suffix sa i suffix sa i 1 rank rank陣列儲存的是 suffix i 在所有字尾中按字典序排序的 名次 總結 字尾陣列是 排第幾的是誰?名次陣列是 你排第幾?lcp i...