You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/string/suffix-automaton.md
+16-1Lines changed: 16 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -193,7 +193,7 @@ Before proceeding to the algorithm itself, we recap the accumulated knowledge, a
193
193
- For each state $v$ one or multiple substrings match.
194
194
We denote by $longest(v)$ the longest such string, and through $len(v)$ its length.
195
195
We denote by $shortest(v)$ the shortest such substring, and its length with $minlen(v)$.
196
-
Then all the strings corresponding to this state are different suffixes of the string $longest(v)$ and have all possible lengths in the interval $[minlength(v); len(v)]$.
196
+
Then all the strings corresponding to this state are different suffixes of the string $longest(v)$ and have all possible lengths in the interval $[minlen(v); len(v)]$.
197
197
- For each state $v \ne t_0$ a suffix link is defined as a link, that leads to a state that corresponds to the suffix of the string $longest(v)$ of length $minlen(v) - 1$.
198
198
The suffix links form a tree with the root in $t_0$, and at the same time this tree forms an inclusion relationship between the sets $endpos$.
199
199
- We can express $minlen(v)$ for $v \ne t_0$ using the suffix link $link(v)$ as:
@@ -494,6 +494,21 @@ The number of different substrings is the value $d[t_0] - 1$ (since we don't cou
494
494
495
495
Total time complexity: $O(length(S))$
496
496
497
+
498
+
Alternatively, we can take advantage of the fact that each state $v$ matches to substrings of length $[minlen(v),len(v)]$.
499
+
Therefore, given $minlen(v) = 1 + len(link(v))$, we have total distinct substrings at state $v$ being $len(v) - minlen(v) + 1 = len(v) - 1 + len(link(v)) + 1 = len(v) - len(link(v))$.
500
+
501
+
This is demonstrated succinctly below:
502
+
503
+
```cpp
504
+
long long tot{};
505
+
for(int i=1;i<sz;i++) {
506
+
tot+=len[i] - len[link[i]];
507
+
}
508
+
```
509
+
510
+
While this is also $O(length(S))$, it requires no extra space besides (what's used for the suffix automaton construction) and no recursive calls, consequently running faster in practice.
0 commit comments