#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...