-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathPKU_2774_SA.cpp
More file actions
73 lines (57 loc) · 1.47 KB
/
PKU_2774_SA.cpp
File metadata and controls
73 lines (57 loc) · 1.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 200010;
char s1[N], s2[N];
int n;
int sa[N], ra[N], tsa[N], *x, *y;
int bu[N];
int h[N];
bool cmp (int *v, int i, int j, int ss) {
return v[i] != v[j] || v[i+ss] != v[j+ss];
}
void suffix_sort () {
int i, m = max (256, n);
x = ra; y = tsa;
memset (bu, 0, sizeof (bu));
for (i = 0; i < n; ++i) bu[x[i] = s1[i]]++;
for (i = 1; i < m; ++i) bu[i] += bu[i-1];
for (i = n - 1; i >= 0; --i) sa[--bu[x[i]]] = i;
for (int ss = 1, p = 0; p < n - 1; ss <<= 1) {
for (i = n - ss, p = 0; i < n; ++i) y[p++] = i;
for (i = 0; i < n; i++) if (sa[i] >= ss) y[p++] = sa[i] - ss;
for (i = 0; i < n; ++i) sa[bu[x[y[i]]]++] = y[i];
bu[0] = 0;
for (swap (x, y), i = 1, x[sa[p = 0]] = 0; i < n; ++i) {
if (cmp (y, sa[i], sa[i-1], ss))
bu[++p] = i;
x[sa[i]] = p;
}
}
}
void cal_height () {
int i, j, k;
for (i = 0; i < n; ++i) ra[sa[i]] = i;
for (k = 0, i = 0; i < n; ++i) if (ra[i] > 1) {
j = sa[ra[i] - 1];
while (s1[i+k] == s1[j+k])k++;
h[ra[i]] = k;
if (k) k--;
}
}
int main () {
int i, j, k;
scanf ("%s", s1); int ls1 = strlen (s1);
scanf ("%s", s2); int ls2 = strlen (s2);
s1[ls1] = '$'; s1[ls1 + 1] = 0;
strcat (s1, s2); n = strlen (s1) + 1;
suffix_sort (); cal_height ();
int ans = -1;
for (i = 0; i < n - 1; ++i) {
if ( (sa[i] < ls1 && sa[i+1] > ls1) || (sa[i] > ls1 && sa[i+1] < ls1))
ans = max (ans, h[i+1]);
}
printf ("%d\n", ans);
return 0;
}