字符串处理之后缀数组
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 #define min(x,y) x>y? y:x 6 #define N 200010 7 int dp[N][33]; 8 int wa[N], wb[N], wsf[N], wv[N], sa[N]; 9 int ra[N], height[N], s[N]; 10 char str[N], str1[N]; 11 int cmp(int *r, int a, int b, int k) 12 { 13 return r[a] == r[b] && r[a + k] == r[b + k]; 14 } 15 void getsa(int *r, int *sa, int n, int m) 16 { 17 int i, j, p, *x = wa, *y = wb, *t; 18 for (i = 0; i < m; i++) wsf[i] = 0; 19 for (i = 0; i < n; i++) wsf[x[i] = r[i]]++; 20 for (i = 1; i < m; i++) wsf[i] += wsf[i - 1]; 21 for (i = n - 1; i >= 0; i--) sa[--wsf[x[i]]] = i; 22 p = 1; 23 j = 1; 24 for (; p < n; j *= 2, m = p) 25 { 26 for (p = 0, i = n - j; i < n; i++) y[p++] = i; 27 for (i = 0; i < n; i++) if (sa[i] >= j) y[p++] = sa[i] - j; 28 for (i = 0; i < n; i++) wv[i] = x[y[i]]; 29 for (i = 0; i < m; i++) wsf[i] = 0; 30 for (i = 0; i < n; i++) wsf[wv[i]]++; 31 for (i = 1; i < m; i++) wsf[i] += wsf[i - 1]; 32 for (i = n - 1; i >= 0; i--) sa[--wsf[wv[i]]] = y[i]; 33 t = x; 34 x = y; 35 y = t; 36 x[sa[0]] = 0; 37 for (p = 1, i = 1; i < n; i++) 38 x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++; 39 } 40 } 41 void getheight(int *r, int n) 42 { 43 int i, j, k = 0; 44 for (i = 1; i <= n; i++) ra[sa[i]] = i; 45 for (i = 0; i < n; i++) 46 { 47 if (k) 48 k--; 49 else 50 k = 0; 51 j = sa[ra[i] - 1]; 52 while (r[i + k] == r[j + k]) 53 k++; 54 height[ra[i]] = k; 55 } 56 } 57 int main() 58 { 59 while (cin >> str) 60 { 61 cin >> str1; 62 int n = 0, len = strlen(str); 63 for (int i = 0; i < len; i++) 64 s[n++] = str[i] - ‘a‘ + 1; 65 s[n++] = 28; 66 len = strlen(str1); 67 for (int i = 0; i < len; i++) 68 s[n++] = str1[i] - ‘a‘ + 1; 69 s[n] = 0; 70 getsa(s, sa, n + 1, 30); 71 getheight(s, n); 72 int max = 0, pos = 0; 73 len = strlen(str); 74 for (int i = 2; i<n; i++) 75 if (height[i]>max) 76 { 77 if (0 <= sa[i - 1] && sa[i - 1] < len&&len < sa[i]) 78 max = height[i]; 79 if (0 <= sa[i] && sa[i] < len&&len < sa[i - 1]) 80 max = height[i]; 81 } 82 cout << max << endl; 83 } 84 return 0; 85 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。