Skip to content

Commit 4d36d39

Browse files
authored
原始的后缀数组(附CodeVS - 1500 后缀排序代码)
1 parent 725c1e3 commit 4d36d39

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed

Suffix-Array(Doubling).cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
4+
#define STRING_LENGTH 100000
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];
15+
int rank[STRING_LENGTH * 2], sa[STRING_LENGTH];
16+
17+
inline bool operator == (const sortinfo &x, const sortinfo &y)
18+
{
19+
return x.x == y.x && x.y == y.y;
20+
}
21+
22+
void radix_sort(sortinfo *d)
23+
{
24+
static sortinfo _d[STRING_LENGTH], res[STRING_LENGTH];
25+
static int c[STRING_LENGTH];
26+
memset(c, 0, sizeof(c));
27+
for (int i = 0; i < l; i++)
28+
{
29+
c[d[i].y]++;
30+
}
31+
for (int i = 1; i <= l; i++)
32+
{
33+
c[i] += c[i - 1];
34+
}
35+
for (int i = l - 1; i >= 0; i--)
36+
{
37+
_d[--c[d[i].y]] = d[i];
38+
}
39+
memset(c, 0, sizeof(c));
40+
for (int i = 0; i < l; i++)
41+
{
42+
c[_d[i].x]++;
43+
}
44+
for (int i = 1; i <= l; i++)
45+
{
46+
c[i] += c[i - 1];
47+
}
48+
for (int i = l - 1; i >= 0; i--)
49+
{
50+
res[--c[_d[i].x]] = _d[i];
51+
}
52+
for (int i = 0; i < l; i++)
53+
{
54+
d[i] = res[i];
55+
}
56+
}
57+
58+
void init_rank()
59+
{
60+
static int c[256];
61+
static sortinfo d[STRING_LENGTH];
62+
int x = 1;
63+
for (int i = 0; i < l; i++)
64+
{
65+
c[(int)s[i]] = 1;
66+
}
67+
for (int i = 0; i < 256; i++)
68+
{
69+
if (c[i] == 1)
70+
{
71+
c[i] = x++;
72+
}
73+
}
74+
for (int i = 0; i < l; i++)
75+
{
76+
rank[i] = c[(int)s[i]];
77+
}
78+
for (int k = 1; k < l; k <<= 1)
79+
{
80+
for (int i = 0; i < l; i++)
81+
{
82+
d[i].x = rank[i];
83+
d[i].y = rank[i + k];
84+
d[i].ord = i;
85+
}
86+
radix_sort(d);
87+
x = 1;
88+
rank[d[0].ord] = 1;
89+
for (int i = 1; i < l; i++)
90+
{
91+
rank[d[i].ord] = (d[i] == d[i - 1] ? x : ++x);
92+
}
93+
}
94+
}
95+
96+
void rank_to_sa()
97+
{
98+
for (int i = 0; i < l; i++)
99+
{
100+
sa[rank[i] - 1] = i + 1;
101+
}
102+
}
103+
104+
int main()
105+
{
106+
scanf("%d%s", &l, s);
107+
init_rank();
108+
rank_to_sa();
109+
for (int i = 0; i < l; i++)
110+
{
111+
printf("%d\n", sa[i]);
112+
}
113+
return 0;
114+
}

0 commit comments

Comments
 (0)