hdu4691(字尾陣列求最長公共字首)

2021-06-25 17:00:09 字數 692 閱讀 9493

學習鏈結    

題意:題目的本質就是求輸入的相鄰的兩個串的最長公共字串,有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...