POJ 2774 (后缀数组 最长公共字串) Long Long Message
2015-04-23 22:34
495 查看
用一个特殊字符将两个字符串连接起来,然后找最大的height,而且要求这两个相邻的后缀的第一个字符不能在同一个字符串中。
代码君
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 200000 + 10; char s[maxn]; int n; int sa[maxn], rank[maxn], height[maxn]; int t[maxn], t2[maxn], c[maxn]; void build_sa(int n, int m) { int i, *x = t, *y = t2; for(i = 0; i < m; i++) c[i] = 0; for(i = 0; i < n; i++) c[x[i] = s[i]]++; for(i = 1; i < m; i++) c[i] += c[i - 1]; for(i = n - 1; i >= 0; i--) sa[--c[x[i]]] = i; for(int k = 1; k <= n; k <<= 1) { int p = 0; for(i = n - k; i < n; i++) y[p++] = i; for(i = 0; i < n; i++) if(sa[i] >= k) y[p++] = sa[i] - k; 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]; swap(x, y); p = 1; x[sa[0]] = 0; for(i = 1; i < n; i++) x[sa[i]] = y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k] ? p - 1 : p++; if(p >= n) break; m = p; } } void build_height() { int k = 0; for(int i = 1; i <= n; i++) rank[sa[i]] = i; for(int i = 0; i < n; i++) { if(k) k--; int j = sa[rank[i] - 1]; while(s[i + k] == s[j + k]) k++; height[rank[i]] = k; } } int main() { //freopen("in.txt", "r", stdin); scanf("%s", s); int pos = strlen(s); s[pos] = 1; scanf("%s", s + pos + 1); n = strlen(s); build_sa(n + 1, 256); build_height(); int ans = 0; for(int i = 2; i <= n; i++) { if(height[i] > ans) { if((sa[i]>pos && sa[i-1]<pos) || (sa[i]<pos&&sa[i-1]>pos)) ans = height[i]; } } printf("%d\n", ans); return 0; }
代码君
相关文章推荐
- POJ 2774 Long Long Message(后缀数组 两个字符串的最长公共字串 )
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
- POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度)
- POJ 2774 long long message(后缀数组求最长公共子串)
- POJ 2774 Long Long Message+Hdu 1403 Longest Common Substring (后缀数组 最长公共子串)
- POJ 2774 Long Long Message 后缀数组求最长公共子串
- POJ2774---Long Long Message(后缀数组,求最长公共子串)
- POJ - 2774 Long Long Message (最长公共子串 后缀数组)
- POJ 2774 Long Long Message 求两个串最长公共子串(后缀数组)
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
- POJ-2774-Long Long Message(后缀数组-最长公共子串)
- 【后缀数组】 POJ 2774 Long Long Message 两个字符串的最长公共子串长度
- POJ 2774 Long Long Message (后缀数组求最长公共子串)
- POJ2774 Long Long Message (后缀数组—最长公共子串)
- POJ 2774 Long Long Message(后缀数组[最长公共子串])
- PKU2774(Long Long Message)求最长公共子串(后缀数组)
- POJ 2774 Long Long Message(后缀数组:公共子串)
- POJ 2774 Long Long Message(后缀数组:公共子串)
- POJ 2774-Long Long Message(后缀数组+高度数组-最大公共子串长度)
- (Relax 后缀数组1.4)POJ 2774 Long Long Message(求两个字符串公共子串的最大长度)