File tree Expand file tree Collapse file tree 1 file changed +51
-0
lines changed
Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Original file line number Diff line number Diff line change 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+ };
You can’t perform that action at this time.
0 commit comments