HDU 1403 字尾陣列初步

2022-05-07 03:45:12 字數 1267 閱讀 4044

題意:求兩個串的最長公共子串

兩個串連線起來然後求高度陣列

注意兩個sa值必須分別在不同一側

本題是用來測試模板的,回想起青島那次翻車感覺很糟糕

#include#include#include#include#include#include#include#include#include#include#include#include#define rep(i,j,k) for(register int i=j;i<=k;i++)

#define rrep(i,j,k) for(register int i=j;i>=k;i--)

#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])

#define iin(a) scanf("%d",&a)

#define lin(a) scanf("%lld",&a)

#define din(a) scanf("%lf",&a)

#define s0(a) scanf("%s",a)

#define s1(a) scanf("%s",a+1)

#define print(a) printf("%lld",(ll)a)

#define enter putchar('\n')

#define blank putchar(' ')

#define println(a) printf("%lld\n",(ll)a)

#define ios ios::sync_with_stdio(0)

using namespace std;

const int maxn = 1e6+11;

const int oo = 0x3f3f3f3f;

const double eps = 1e-7;

typedef long long ll;

ll read()

while(ch>='0'&&ch<='9')

return x*f;

}char str[maxn];

struct saelse

} for(int l=1;rank[sa[n]]r)swap(l,r);

l++;

int k=log2(r-l+1);

return min(best[l][k],best[r-(1len&&sa.sa[i-1]<=len))

}} println(ans);

} return 0;

}

順便貼一下學習路線:

hdu1403 字尾陣列模板

題意 給出兩個字串,求他們的最長公共子串 思路 兩個字串的最長公共子串長度顯然就是兩個字串的所有字尾中的最長公共字首長度.可以先用乙個沒有出現的字元 便於後面區分字尾是否屬於相同字串 將兩個字串連成乙個字串,再用字尾陣列求其height,sa陣列,對於當前 i,通過 sa 陣列區分字尾 i 和 i ...

HDU1403 字尾陣列,模板,入門)

解題思路 字尾陣列的寫法一開始看有些匪夷所思,花了我半天時間才解析完,理解內涵。關於height,詳見我的另一篇字尾陣列分組中的部落格。也推薦幾篇 解析 原理講解 原理講解 題意 給出兩個字串,求他們的最長公共子串 字尾陣列建立字尾優先順序的複雜度為o nlogn n為字串的長度。用height求解...

hdu1403 字尾陣列入門題

1403 思路 字串的任何乙個子串都是這個字串的某個字尾的字首,則求a和b的最長公共子串等價於求a的字尾和b的字尾的最長公共字首的最大值。做法 將第二個字串寫在第乙個字串後面,中間用乙個沒有出現過的字元隔開,再求這個新的字串的字尾陣列。1 include bits stdc h 2 using na...