Skip to content

Commit 4f2d4c3

Browse files
committed
Add suffix automaton
1 parent 1bbe706 commit 4f2d4c3

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
struct state
2+
{
3+
int len, link;
4+
map<char, int> next;
5+
};
6+
const int N = 300000 + 5;
7+
8+
struct SA
9+
{
10+
state st[2 * N];
11+
int fpos[2 * N];
12+
int sz, last;
13+
14+
void sa_init()
15+
{
16+
sz = last = 0;
17+
st[0].len = 0;
18+
st[0].link = -1;
19+
++sz;
20+
}
21+
22+
void sa_extend(char c)
23+
{
24+
int cur = sz++;
25+
st[cur].len = st[last].len + 1;
26+
fpos[cur] = st[cur].len - 1;
27+
int p;
28+
for(p = last; p != -1 && !st[p].next.count(c); p = st[p].link)
29+
st[p].next[c] = cur;
30+
if(p == -1)
31+
st[cur].link = 0;
32+
else
33+
{
34+
int q = st[p].next[c];
35+
if(st[p].len + 1 == st[q].len)
36+
st[cur].link = q;
37+
else
38+
{
39+
int clone = sz++;
40+
st[clone].len = st[p].len + 1;
41+
st[clone].next = st[q].next;
42+
st[clone].link = st[q].link;
43+
fpos[clone] = fpos[q];
44+
for(; p != -1 && st[p].next[c] == q; p = st[p].link)
45+
st[p].next[c] = clone;
46+
st[q].link = st[cur].link = clone;
47+
}
48+
}
49+
last = cur;
50+
}
51+
};

0 commit comments

Comments
 (0)