Skip to content

Commit 022fe98

Browse files
authored
最长公共子串(附CodeVS - 3160 最长公共子串代码)
1 parent 2cc143a commit 022fe98

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

Longest-Common-Substring.cpp

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
4+
#define STRING_LENGTH 300000
5+
6+
using namespace std;
7+
8+
struct sortinfo
9+
{
10+
int x, y, ord;
11+
};
12+
13+
int l;
14+
char s[STRING_LENGTH], t[STRING_LENGTH / 2];
15+
int rank[STRING_LENGTH * 2], sa[STRING_LENGTH], height[STRING_LENGTH];
16+
17+
void radix_sort(sortinfo *d)
18+
{
19+
static sortinfo _d[STRING_LENGTH], res[STRING_LENGTH];
20+
static int c[STRING_LENGTH];
21+
memset(c, 0, sizeof(c));
22+
for (int i = 0; i < l; i++)
23+
{
24+
c[d[i].y]++;
25+
}
26+
for (int i = 1; i <= l; i++)
27+
{
28+
c[i] += c[i - 1];
29+
}
30+
for (int i = l - 1; i >= 0; i--)
31+
{
32+
_d[--c[d[i].y]] = d[i];
33+
}
34+
memset(c, 0, sizeof(c));
35+
for (int i = 0; i < l; i++)
36+
{
37+
c[_d[i].x]++;
38+
}
39+
for (int i = 1; i <= l; i++)
40+
{
41+
c[i] += c[i - 1];
42+
}
43+
for (int i = l - 1; i >= 0; i--)
44+
{
45+
res[--c[_d[i].x]] = _d[i];
46+
}
47+
for (int i = 0; i < l; i++)
48+
{
49+
d[i] = res[i];
50+
}
51+
}
52+
53+
void init_rank()
54+
{
55+
static int c[256];
56+
static sortinfo d[STRING_LENGTH];
57+
int x = 1;
58+
for (int i = 0; i < l; i++)
59+
{
60+
c[(int)s[i]] = 1;
61+
}
62+
for (int i = 0; i < 256; i++)
63+
{
64+
if (c[i] == 1)
65+
{
66+
c[i] = x++;
67+
}
68+
}
69+
for (int i = 0; i < l; i++)
70+
{
71+
rank[i] = c[(int)s[i]];
72+
}
73+
for (int k = 1; k < l; k <<= 1)
74+
{
75+
for (int i = 0; i < l; i++)
76+
{
77+
d[i].x = rank[i];
78+
d[i].y = rank[i + k];
79+
d[i].ord = i;
80+
}
81+
radix_sort(d);
82+
x = 1;
83+
rank[d[0].ord] = 1;
84+
for (int i = 1; i < l; i++)
85+
{
86+
rank[d[i].ord] = (d[i].x == d[i - 1].x && d[i].y == d[i - 1].y ? x : ++x);
87+
}
88+
if (x == l)
89+
{
90+
break;
91+
}
92+
}
93+
}
94+
95+
void rank_to_sa()
96+
{
97+
for (int i = 0; i < l; i++)
98+
{
99+
sa[rank[i]] = i;
100+
}
101+
}
102+
103+
void init_height()
104+
{
105+
int k = 0;
106+
for (int i = 0; i < l; i++)
107+
{
108+
if (k > 0)
109+
{
110+
k--;
111+
}
112+
if (rank[i] == l)
113+
{
114+
continue;
115+
}
116+
for (; s[i + k] == s[sa[rank[i] + 1] + k]; k++) ;
117+
height[rank[i]] = k;
118+
}
119+
}
120+
121+
int main()
122+
{
123+
int l1, l2;
124+
scanf("%s%s", s, t);
125+
l1 = strlen(s);
126+
l2 = strlen(t);
127+
s[l1] = '#';
128+
strcat(s, t);
129+
l = l1 + l2;
130+
init_rank();
131+
rank_to_sa();
132+
init_height();
133+
int maxlen = 0;
134+
for (int i = 1; i < l; i++)
135+
{
136+
if (height[i] > maxlen && ((sa[i] < l1 && sa[i + 1] > l1) || (sa[i] > l1 && sa[i + 1] < l1)))
137+
{
138+
maxlen = height[i];
139+
}
140+
}
141+
printf("%d", maxlen);
142+
return 0;
143+
}

0 commit comments

Comments
 (0)