poj 2774 字尾陣列

2021-08-25 18:28:33 字數 1127 閱讀 6434

#include #include #define debug

#ifdef debug

#define debug(...) printf( __va_args__)

#else

#define debug(...)

#endif

#define maxn 200004

#define min(a, b) (a) < (b) ? (a) : (b)

int wx[maxn],wy[maxn],c[maxn], h[maxn];

int sa[maxn], *rank, height[maxn];

int cmp(int *r,int a,int b,int l)

/* 倍增法求字尾陣列, 所有陣列都從下標0開始 */

void da(char *r,int *sa,int n,int m)

for(i = 0; i < n; i++)

} //對第一關鍵字使用計數排序, 生成sa

for(i = 0; i <= m; i++) c[i] = 0;

for(i = 0; i < n; i++) c[x[y[i]]]++;

for(i = 1; i <= m; i++) c[i] += c[i-1];

for(i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];

//根據sa生成rank,儲存在陣列x中,x[i] = j表示suffix[i]排在第j位, 相同的字尾名次相同,

//所以還要根據上次的x陣列來判斷兩個字尾是否一樣,優化點:

//交換x和y,這樣y指向上次的x,原來y指向的空間用來存放新生成的rank

for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; i++)

} rank = x;

}int main()

else

} //求height[1]...height[n]

height[1] = 0;

for (i = 2; i <= n; i++)

} printf("%d\n", max_len);

return 0;

}

POJ 2774 字尾陣列

題意 求兩個串的最長公共子串 思路 在求出height陣列之後,再把sa陣列區分出來,只要其中乙個sa i s i 1 陣列是屬於第一串,s i 1 s i 屬於第二串,那麼我們可以求得其最大值,之所以可以這樣做,是因為sa陣列已經對字串按字典序排好序了 include include includ...

poj 2774 字尾陣列模板

求兩個字串的最長公共子串。將兩個字串連線為乙個新字串,並計算字尾陣列和高度陣列lcp。然後檢查字尾陣列中所有相鄰的字尾,其中字尾分別屬於第一和第二個字串的lcp的最大值就是答案。include include include include include include include inclu...

POJ 2774 字尾陣列基礎題

poj 2774 題意 求兩個字串的最長公共子串。總結 搞了半天還是不太理解,看著大神部落格強行敲的。而且還看到有hash 二分做的。poj 2774 include include include include include include include include include in...