Time-Optimal Construction
of String Synchronizing Sets
Abstract
A powerful design principle behind many modern string algorithms is local consistency: breaking the symmetry between string positions based on their small contexts so that matching fragments are handled consistently. Among the most influential instantiations of this principle are string synchronizing sets [Kempa & Kociumaka; STOC 2019]. A -synchronizing set of a string of length is a set of string positions, chosen using their length- contexts, such that (outside of highly periodic regions) every block of consecutive positions contains at least one element of the set. Synchronizing sets have found dozens of applications in diverse settings, from quantum and dynamic algorithms to fully compressed computation. In the classic word RAM model, particularly for strings over small alphabets, they enabled faster solutions to core problems in data compression, text indexing, and string similarity.
In this work, we show that any string can be preprocessed in time so that, for any given integer , a -synchronizing set of can be constructed in time. Both bounds are optimal in the word RAM model with machine word size , matching the information-theoretic minimum for the input and output sizes, respectively. Previously, constructing a -synchronizing set required time after an -time preprocessing [Kociumaka, Radoszewski, Rytter, and Waleń; SICOMP 2024], or, in the restricted regime of , without any preprocessing needed [Kempa & Kociumaka; STOC 2019].
A simple instantiation of our method outputs the synchronizing set as a sorted list in time, or as a bitmask in time. Our optimal construction produces a compact fully indexable dictionary, supporting select queries in time and rank queries in time. The latter complexity matches known unconditional cell-probe lower bounds for .
To achieve this, we introduce a general framework for efficiently processing sparse integer sequences via a custom variable-length encoding. We also augment the optimal variant of van Emde Boas trees [Pătraşcu & Thorup; STOC 2006] with a deterministic linear-time construction. When the set is represented as a bitmask under our sparse encoding, the same guarantees for select and rank queries hold after preprocessing in time proportional to the size of our encoding (in words).
Keywords and phrases:
synchronizing sets, local consistency, packed stringsFunding:
Jonas Ellert: Partially funded by grant ANR20-CE48-0001 from the French National Research Agency.Copyright and License:
2012 ACM Subject Classification:
Theory of computation Pattern matchingEditors:
Meena Mahajan, Florin Manea, Annabelle McIver, and Nguyễn Kim ThắngSeries and Publisher:
Leibniz International Proceedings in Informatics, Schloss Dagstuhl – Leibniz-Zentrum für Informatik
1 Introduction
In many string processing tasks, one can afford a relatively costly preprocessing for a small fraction of positions in the input string. The choice of these positions often governs how useful the preprocessing is. The most natural selection mechanisms rely only on the length of the input string and the “selection rate” ; this includes selecting multiples of , sampling positions uniformly at random, as well as difference covers [31]. Although these simple mechanisms are sufficient in some scenarios, the principle of a locally consistent selection has enabled a myriad of new applications. Here, the idea is to select a position based on the symbols at the nearby positions, without looking at the integer itself. This ensures that any two positions are handled in the same way whenever they appear in the same context.
The concept of local consistency can be traced back to Sahinalp and Vishkin’s locally consistent parsing [38, 39, 40]. Further hierarchical parsing mechanisms appeared in [11, 12, 19, 20, 32]. Their drawback is that the context size is typically bounded in terms of the number of fixed-level phrases of the parsing, which can vary between regions of the string.
Local consistency is also frequently used in applied research, especially bioinformatics, where minimizers [36, 41] are the most popular mechanism. Here, the context size is easily controlled, but the number of selected positions is known to be only for random strings.
String synchronizing sets [22] are a relatively recent local consistency mechanism that addresses the two issues with previous alternatives, paving the way for many more applications (see a dedicated paragraph near the end of this section). A -synchronizing set for a length- string is a set satisfying two conditions: The consistency condition states that, if two positions share their size- contexts (formalized as ), then either both positions are synchronizing () or neither of them is (). The density condition requires that, among every consecutive positions in , at least one belongs to , except in highly periodic regions of (see Definition 5.1 for a formal definition). The central contribution of Kempa and Kociumaka [22] is that every length- string admits, for every positive integer , a -synchronizing set of size that can be constructed deterministically in time. This construction uses sliding window minima, similarly to how minimizers are defined.
The original motivation for string synchronizing sets was to efficiently process strings over small alphabets of size . In this regime, one can store symbols in a single machine word (integer variable) of bits, which allows solving problems in time, e.g., in time, proportional to the size of the input in machine words. The main algorithms of [22] utilize -synchronizing sets for a small , which are built in time. More generally, [22] provides an -time -synchronizing set construction for every by adapting the -time construction for arbitrary .
Several further works [2, 8, 28] rely on a hierarchy of -synchronizing sets constructed for different values of . Kociumaka, Radoszewski, Rytter, and Waleń [28] build such a hierarchy using a novel construction algorithm based on restricted recompression, a locally consistent parsing scheme that modifies recompression by Jeż [19, 20]. After an -time preprocessing, their algorithm constructs a -synchronizing set (given any ) in time.
While the two existing constructions have already been very impactful, several natural questions remain open, limiting further use cases. The following is perhaps the simplest one:
Can one construct a small -synchronizing set in time if and ?
In general, we can ask for a single construction algorithm subsuming the two current methods:
Is there an algorithm that, after -time preprocessing of a given string, allows constructing a -synchronizing set in time for any given ?
The first main result of this work, presented in Sections 3, 4, and 5, answers both questions positively:
Theorem 1.1 (Simplified version of Theorem 5.3).
A string can be preprocessed in time so that, given , a -synchronizing set of of size can be constructed in time.
Our algorithm returns as a sorted list, but the same techniques allow returning as a bitmask in time, which is faster when ; see Theorem 5.4.
While these two representations are compact (asymptotically optimal up to a constant factor) for -size subsets when and , respectively, we can hope for a smaller representation and a faster construction algorithm for intermediate values of . We address this in Section 6, where we provide an -time algorithm that outputs a representation supporting efficient select and rank queries (asking for the -th smallest synchronizing position and the number of synchronizing positions smaller than , respectively).
Theorem 1.2 (Simplified version of Corollary 6.20).
A string can be preprocessed in time so that, given , a -synchronizing set of of size can be constructed in time. The set is reported in an -bit representation that supports select queries in time and rank queries in time.
As discussed in Lemma 6.1, our representation size is asymptotically optimal. Hence, the preprocessing time and the construction time are also optimal for the machine word size of bits. The time complexity of rank queries reduces to constant time for and matches the unconditional lower bound of Pătraşcu and Thorup [33] for .
Our Techniques.
The algorithm behind Theorem 1.1 builds upon the construction of [28]. For this, in Section 3, we show how to implement restricted recompression in time. During the first rounds, we simulate restricted recompression on every possible length- context and keep track of how many times each context occurs in the input string. In the remaining rounds, we process each phrase in constant time. What enables such an approach is that the context size in the -th round of restricted recompression is bounded by and the number of phrases is , where .
Before we can derive Theorem 1.1 in Section 5, we also need a data structure for reporting runs (maximal periodic fragments) in the input string, which we present in Section 4.
Upon a transition from Theorem 1.1 to Theorem 1.2, several seemingly simple steps become difficult to implement. The prevailing challenge is to process sparse integer sequences in time per non-zero entry. Our strategy is to introduce a variable-length encoding of such sequences, implement operations on them using transducers (finite automata with output tapes), and provide a general method for speeding up transducer execution using precomputed tables. We believe that our approach, outlined in Section 6, will be useful in many other contexts to efficiently manipulate compact data representations.
In particular, in order to provide rank and select support in Theorem 1.2, we provide a new compact variant of van Emde Boas trees [42] matching the optimal query time bounds of Pătraşcu and Thorup [33] and, unlike existing variants, constructible deterministically in linear time.
Theorem 1.3.
Let of size with and be given as an array of -bit integers in increasing order. For , let . A deterministic data structure that answers rank and predecessor queries in time can be built in time and words of space.
If the input set is provided using our sparse representation, we even achieve construction time proportional to the number of machine words in the compact encoding of the set (and, in many cases, sublinear in the number of set elements); see Section 6.3.
Applications of Synchronizing Sets.
Since their introduction in 2019, string synchronizing sets have found numerous applications across a variety of settings. For strings over small alphabets, they enabled -time algorithms for fundamental decades-old tasks such as Burrows–Wheeler transform [22], Lempel–Ziv factorization [15, 26], and the longest common factor problem [8]. They are also behind the only -time constructions of compact suffix array and suffix tree representations [25] and data structures for longest common extension (LCE) [22, 13] and internal pattern matching (IPM) [28] queries. Further applications include detecting regularities in strings, such as palindromes [10], squares [9], and covers [35].
In some applications, including IPM queries [28] and the longest common factor with mismatches problem [8], string synchronizing sets also enabled speed-ups for large alphabets. In certain cases, such as for the longest common circular factor problem [2], the obtained speed-up is as large as from to . Polynomial-factor speed-ups also arise beyond the classic setting, thanks to adaptations of synchronizing sets (with custom constructions) to the dynamic [23], quantum [1, 21], and fully-compressed [24, 26] settings.
Other Local Consistency Mechanisms.
There are dozens of local consistency mechanisms with different features and use cases. Beyond those mentioned above, theoretical methods include sample assignments [27] and the partitioning sets [6], which predate synchronizing sets. In the algorithm engineering community, beyond minimizers (see [17, Chapter 6] for a very recent literature overview), notable alternatives include locally consistent anchors [30, 3] and the prefix-free parsing [7], which is particularly useful in the context of suffix sorting.
2 Preliminaries
For , we write to denote . We also write to denote . A string of length over alphabet is a sequence of symbols from . For , the -th symbol is , and the sequence is denoted by (which is the empty string if ). For , consider . We may interpret and as substrings. We then write and say that the substrings match if and only if and . We can choose to interpret them as fragments instead, in which case we write and say that the fragments are equal if and only if and (or if both fragments are empty). For fragments and , we denote their intersection as .
The concatenation of two strings and is defined as , and the -times concatenation of with itself is written as , where . Note that is the empty string. The unique primitive root of a non-empty string is the shortest prefix of such that there is with .
Model of Computation.
We assume the word RAM model (see, e.g., [18]) with words of bits when processing a text with . The text and all other strings encountered throughout the paper are assumed to be in -bit representation, i.e., each symbol uses exactly bits, the entire text occupies consecutive bits of memory, and each memory word fits symbols. Using arithmetic and bitwise operations, we can extract any substring of length up to in a single word in time.
In the analysis, will only appear when the claimed (pre-)processing time is . For obtaining these results, we assume that , that the symbol does not occur in , and that we have access to the -bit representation of . This assumption is without loss of generality, which we show in the complete version.
Accessing lookup tables with substrings.
We will use substrings of length at most to access lookup tables. For a string of length , we define its integer representation as follows:
-
consists of bits, i.e., .
-
The upper half of contains the binary representation of (consisting of bits), padded with 0-bits.
-
The lower half of stores the length . This value can indeed be stored in bits. (The inequality holds if exceeds some constant.)
As mentioned earlier, extracting a substring of length takes constant time. Mapping to and vice versa also takes constant time.
2.1 Revisiting Restricted Recompression
Following [28], we define integer sequences so that and so that and recursively . These sequences control, respectively, the phrase lengths and context sizes at each recompression round. As observed in [28], holds for every . Our goal is to compute the following sets:
Proposition 2.1 ([28, Propositions 3.4 and 4.7]).
For every length- text , there exists a descending chain with such that, for each , the set satisfies the following:
-
(a)
-
(b)
For , if and , then .
-
(c)
If are consecutive positions in , then has length at most , or its primitive root has length at most .
If , then one can construct in time.
Remark 2.2.
While is not stated in [28, Propositions 3.4 and 4.7], it readily follows from Proposition 2.1(a), in which we have if (see also [28, p. 1542]).
Our sublinear-time solution for the initial rounds of restricted recompression closely follows the structure of the linear-time algorithm in the proof of Proposition 2.1 (see [28, Proposition 4.7]). We now give a conceptual description of this algorithm (ignoring implementation details). If we can show that the new solution is functionally identical to this algorithm, then it correctly computes the sets satisfying Proposition 2.1.
We start with the set . Assume that, for some , we have computed the set with . Let and , and define for . Now we compute the set .
Case 1: is even.
For each , we add to if and only if or (or both). This can be viewed as merging each run of identical phrases (of length at most ) into a single new phrase (see Figure 1(a)).
Case 2: is odd.
Let be the set of distinct phrases of length at most , viewed as strings rather than fragments (so matching phrases represent the same element of ). We partition into sets and . For each , we add to unless both and . This amounts to merging adjacent pairs of phrases whenever the left phrase is in and the right phrase is in (see Figure 1(b)).
The sets are computed by modeling the factorization as a directed multigraph whose nodes are the elements of . For every , we add an edge from to if . (Due to the preceding even round, it is clear that .) Let be the multiset of all edges. To obtain the properties in Proposition 2.1, it suffices to partition into and so that at least edges go from to . This can be achieved by approximating a maximum directed cut in the multigraph (e.g., using [28, Lemma A.1]).
Equivalently, we can use a weighted directed graph instead of a multigraph. The set of nodes is still . For each pair of nodes , the weight of the edge from to is the number of edges from to in the multigraph. Then, we partition into and so that the sum of the weights of edges from to is at least (see Figure 1(c)).
3 Restricted Recompression in Sublinear Time
In this section, we show how to implement restricted recompression in time. If is constant, then we can afford linear time and use the solution from [28]. Hence, assume . We fix . Recalling that , we observe that . During rounds of restricted recompression, by Proposition 2.1(b), the phrase boundaries are chosen based on short contexts of length at most , and hence this process can be accelerated using word-packing techniques. After round , the number of boundary positions is at most by Proposition 2.1(a), and we can implement the remaining rounds in time using the linear-time solution presented in [28]. We only need the following straightforward corollaries.
Definition 3.1.
Let with be one of the sets computed in Proposition 2.1, and let and . We define
-
the (not necessarily unique) string of phrase names over alphabet , where, for every , it holds if and only if ,
-
the array of phrase lengths with for all .
Corollary 3.2 (of [28, Proposition 4.7]).
Let . Given , , and , one can compute in time.
Proof.
The algorithm from the proof of [28, Proposition 4.7] uses , and to compute , and in time. Hence, the remaining sets can be computed in time. By Proposition 2.1(a) and the definition of , the sum is bounded by .
Corollary 3.3.
Given the elements of in increasing order, one can compute the sets in time.
Proof.
Let with for all , and define and . Note that by Proposition 2.1(a) and the definitions of and . By Corollary 3.2, it suffices to compute and in time, which is trivial for . To compute , we first produce a string over a slightly larger alphabet. For each , we encode phrase as , where is the truncated phrase . Trivially, two phrases are identical if and only if they have the same length and primitive root. By Proposition 2.1(c), the primitive root of any phrase is of length at most . Since is either the entire phrase or a length- prefix of the phrase, it is also a (possibly fractional) power of the primitive root of the phrase. Hence, it is easy to see that we indeed encode two phrases identically if and only if they are identical. Clearly, can be computed in time. We obtain by reducing the alphabet to using radix sort in time.
3.1 Performing the Initial Rounds
In the initial rounds of recompression, the weights in the graph of adjacent phrases depend on the abundance of short substrings. Hence, we use the following simple index for counting short substrings. A proof is provided in the full version.
Lemma 3.4.
For any string , in time, we can construct a data structure that answers the following type of query in constant time. Given a string of length at most , return the number of occurrences of in .
Defining phrase boundaries via substrings.
Instead of directly computing , we compute the intermediate representation111Recall that is padded so that . Hence, with is always defined. Also, if , then is unique in . i.e., rather than explicitly listing the boundary positions, we instead list the set of distinct contexts that cause a boundary. From now on, for and , we say that a string is a boundary context of . For every , it follows from Proposition 2.1(b) that if and only if .
Lemma 3.5.
The sets can be computed in time, with each set encoded as a bitmask of length whose set bits are .
Proof.
The sets consist of strings of length up to . We can encode any as . We construct the data structure from Lemma 3.4 for the padded string , which allows querying for . We can also query for strings of the form and with .
Initialization.
We initialize each of as an all-zero bitmask of length . Recall that . For computing , we enumerate all possible length-two strings over , except for . For each such string , we query the data structure from Lemma 3.4. If occurs in , we set the -th bit of to one. Recall that ; hence, we can indeed afford to enumerate all strings of length up to (e.g., the strings of length two during initialization) in time.
Preparing round .
Assume that we have already computed for some , and our goal is to compute . The main computational challenge is the following. For each length- string over alphabet , except for , we have to decide if . We enumerate all the possible strings of length . For each such string , we first check if it is indeed a substring of the padded string using the data structure from Lemma 3.4. If is not a substring, then it is not a boundary context of and can be skipped. Otherwise, we consider its central part . If is not a boundary context of , i.e., if (a check performed in constant time), then cannot be a boundary context of due to . Hence, if , we do not have to process any further.
If, however, it holds , then we have to decide whether we will make a boundary context of by adding to . For the sake of explanation, consider any position such that . We now explain how to compute the minimal values such that and . If both values exist, then the factorization induced by contains fragments and as phrases. If, however, or does not exist, then we know that the phrase ending at position or the phrase starting at position is of length more than (possibly both). When creating , the algorithm from [28, Proposition 4.7(a)] (see also Section 2.1) merges two adjacent phrases only if both of them are of length at most . Hence, if or does not exist, then the phrases around boundary cannot be merged, and is a boundary position in .
We now explain how to compute or show that it does not exist; the computation for is symmetric. Consider any . Due to and , it holds
Hence, we can check if is in by probing with in constant time. By trying all possible values, finding the minimal suitable takes time. If both and exist, then we add a tuple to a list . Otherwise, as explained above, we have to make a boundary context of by adding to .
After processing all possible strings , we have the following situation. If a boundary position in is adjacent to a phrase of length over , then the corresponding boundary context has been added to . (This is always the case for the contexts and of positions and , respectively). If a boundary position in has context and is adjacent to phrases of respective lengths , then has been added to . Since each context has been added to at most once, the elements of are distinct.
Performing an even round.
Consider a boundary position in for which the two adjacent phrases are identical and of length at most . The run of identical phrases will be merged in , and the boundary position will no longer exist. Hence, we proceed as follows. We consider each element of the list . If , then we add to ; otherwise, we do nothing (skip the element of ).
Performing an odd round.
We have to produce the weighted directed graph described in Section 2.1. The set of nodes is
For each , we obtain the number of occurrences of in the padded using the data structure from Lemma 3.4. We increase the weight of the edge from to by . (This results in no self-loops, as phrases in are of length , and runs of phrases of length have been eliminated in the preceding even round.) Observe that , and each element of contributes weight to one edge. Therefore, the number of edges is , and we can approximate the maximum cut in time (see, e.g., [28, Lemma A.1], which immediately works for weighted graphs). This reveals the two parts and used for computing . We once more consider each and check if and . Whenever this is the case, we do nothing (skip the element of ). Otherwise, we add to .
Time complexity and correctness.
In each round, we have to consider all the possible strings of length . We process each string in time, dominated by the time needed to compute and . We spend additional time to approximate the maximum cut. Recalling that , the overall time is , plus time for the preprocessing of Lemma 3.4. The correctness follows from the fact that the algorithm directly implements the steps described in Section 2.1.
3.2 Reporting the Phrase Boundaries
The number of boundaries in the initial rounds may significantly exceed , and thus we cannot afford to report them explicitly. Instead, we report a bitmask of length that marks the boundaries.
Lemma 3.6.
For an integer , consider a set . Given a text and an -time membership oracle to , a bitmask representing can be constructed in time.
Proof.
First, we construct an array so that, for each string of length , the entry is a bitmask of length representing . Due to constant-time oracle access to , the construction of takes time.
Next, for each , we extract a string . In other words, this is a decomposition of into substrings of length (with the last one of length between and ) overlapping by exactly positions. Finally, we construct the resulting bitmask by concatenating the bitmasks for subsequent indices . This is valid because, for each , we have and the concatenated bitmasks are of length exactly (except for the last one, whose length is between and ).
The well-known folklore Lemma below efficiently transforms a bitmask into an explicit set; a proof is provided for completeness.
Lemma 3.7.
Given a bitmask of length , the set can be output in increasing order in time.
Proof.
We use a lookup table , where entry contains a list of the one-bits in the binary representation of in left to right order. Clearly, the table can be computed in time. Then, we can process the mask in chunks of size (padding the final chunk with zeros). For each chunk, we look up the list of one-bits and report them after applying the appropriate offset. This takes time.
Lemma 3.8.
Given and a parameter , a set (represented as a bitmask) satisfying the conditions of Proposition 2.1 can be constructed in time.
Proof.
If , the set constructed in the proof of Lemma 3.5 serves as an -time membership oracle to the set of boundary contexts. We then convert to using Lemma 3.6 on the text , discarding the initial and final value (corresponding to positions and ). (Lemma 3.6 marks the leftmost position of each boundary context occurrence, and contexts are of length ; since position in corresponds to position in , the reported positions are the central positions of boundary contexts in , as required.) If , we first construct the bitmask for and then convert it into an explicit list of positions with Lemma 3.7. Then, we use Corollary 3.3 to obtain in explicit representation in time, which we convert back into a bitmask in time. Due to , the time is as claimed.
Lemma 3.9.
A text can be preprocessed in time so that, given , a set satisfying the conditions of Proposition 2.1 can be constructed in time. The elements of are reported from left to right.
Proof.
For , we can simply use Lemmas 3.8 and 3.7, which takes time. For all , the sets can be computed during preprocessing as follows. We compute in explicit representation using Lemmas 3.8 and 3.7. Then, we obtain all the remaining sets using Corollary 3.3.
4 Computing -Runs in Sublinear Time
An integer is a period of a string if holds for each . We denote the smallest period of a non-empty string by , and we call periodic whenever .
A run (a maximal repetition) in a string is a periodic fragment of that can be extended neither to the left nor to the right without increasing the smallest period , i.e., or , and or . The set of all runs in is denoted by . Crucially, the periodicity lemma [16] implies that distinct runs cannot overlap too much.
Fact 4.1 ([29, Lemma 1(ii)]).
Let be distinct yet overlapping runs in a string . If and , then .
Among many consequences of ˜4.1 is that every periodic fragment can be uniquely extended to a run such that and . We denote this unique extension by . If is not periodic, we write to indicate that the run extension is undefined.
Theorem 4.2 ([28, Theorem 1.5]).
A text can be preprocessed in time so that, given a fragment of , the run extension can be computed in time. If , then the query algorithm also returns the shortest period .
For , we write The construction of string synchronizing sets relies on -runs defined for as
Proposition 4.3.
One can preprocess a text in time so that, given integers with , one can output the set in time. The runs are reported together with their periods and simultaneously ordered by their start and end positions.
Proof.
In the preprocessing phase, we construct the data structure of Theorem 4.2. At query time, if , then we trivially return the empty set. Otherwise, we pick and, for , consider fragments . For each , we compute and output as long as , , and (or ). The query time is clearly . Correctness is easy to verify; for completeness, a proof is provided in the full version.
Lemma 4.4.
For a text of length and integers , define
If , then
Proof.
Consider . For each , the fragment is contained in , and thus . Consequently, .
Next, for a proof by contradiction, suppose that . This means that and thus . The fragment is contained in both and , so the intersection of these two runs consists of at least positions. This contradicts ˜4.1, and thus . A symmetric argument shows that .
It remains to prove that every maximal interval corresponds to a run . Since , we have , and thus . Denote ; as previously shown, is a maximal interval contained in . Since holds due to and and since is also a maximal interval contained in , we conclude that , i.e., holds as claimed.
Proposition 4.5.
Given a string and parameters , the bitmask can be constructed in time.
Proof.
Observe that, in time, we can construct a bitmask of length whose set bits are . This gives us constant-time oracle access to the set . Now, Lemma 3.6 lets us construct in time a bitmask representing . The overall running time is .
5 String Synchronizing Sets in Sublinear Time
Definition 5.1 (Synchronizing set [22]).
For a string and parameter , a set is a -synchronizing set of if it satisfies the following two conditions:
- Consistency:
-
For , if and , then .
- Density:
-
For , we have if and only if .
Proposition 5.2 ([28, Construction 3.5 and Lemma 5.2]).
For a string , let be a descending chain satisfying Proposition 2.1. Consider a parameter .
Define a set so that a position belongs to if and only if and at least one of the following conditions holds:
-
, where ;
-
there exists a -run such that ; or
-
there exists a -run such that .
Then, is a -synchronizing set of size .
Theorem 5.3 (Compare [28, Theorem 1.13]).
A string can be preprocessed in time so that, given , a -synchronizing set of of size can be constructed in time. Moreover, holds for every .
Proof.
We build based on the construction specified in Proposition 5.2. At preprocessing time, we build an array of intervals with . Note that and for . Since and the values can be computed in time each (using constant-time arithmetic operations on -bit integers), this preprocessing takes time. We also apply the -time preprocessing of Lemmas 3.9 and 4.3.
Given , we first compute by scanning from the top down to find the largest with . This takes time. Next, we apply Lemma 3.9 to generate in time, where the definition of implies . Then, we use Proposition 4.3 to compute , with runs simultaneously ordered by their start and end positions; this also takes time. Finally, we proceed exactly as in the proof of [28, Theorem 1.13], where it is shown how to derive from and in time.
Theorem 5.4.
Given a string and a parameter , a -synchronizing set of of size , represented as a bitmask, can be constructed in time. Moreover, holds for every .
Proof.
If , we apply Theorem 5.3 with preprocessing followed by a single query. In time, this yields the explicit representation of the set satisfying the desired conditions. We convert this set into a bitmask by starting with an all-0 bitmask and setting the -th bit for every . This conversion also takes time.
In the complementary case of , we first compute in time by naively iterating over all possibilities. Then, we apply Lemma 3.8 to compute a bitmask representing and Proposition 4.5 to compute bitmasks representing and ; both subroutines take time. According to Proposition 5.2, a synchronizing set satisfying the desired conditions can be obtained by including a position if and only if (which is equivalent to ) and at least one of the following conditions hold:
Consequently, the bitmask representing can be computed using bitwise operations (AND, OR, NOT) applied to the following components: ; the mask shifted by positions and padded with -bits; and four copies of , shifted and padded as follows – by positions with -bits, by position with -bits, by positions with -bits, and by positions with -bits. All these bit-wise operations, including shifts and padding, can be implemented in time, giving a total time of .
6 Improving the Query Time
In the remainder of the paper, we further improve the query time for synchronizing set construction from to , while retaining the preprocessing time. We only outline the main algorithmic ideas here, with proofs of all claims in the full version.
The synchronizing set will be output in a representation of size bits. We show that this is optimal in the lemma below, which models the query algorithm as a function mapping an input string into an encoding of a -synchronizing set of such that can be recovered from alone using an accompanying decoding function .
Lemma 6.1.
Consider integers such that , as well as a pair of functions and jointly satisfying the following property:
For every , the set is a -synchronizing set of .
Then, there exists such that .
Proof.
Let . For an arbitrary string , we construct defined by , with an arbitrary suffix . For any -synchronizing set, the first synchronizing position in is . This holds due to Proposition 5.2 and the fact that is a suffix of a -run. Hence, given any -synchronizing set of , we can restore . Consequently, over all the , the average size of the encoded set is at least bits.
Sparse encodings.
Our representation of the constructed -synchronizing set is its bitmask in a special sparse encoding. During the construction, we also encode intermediate integer arrays, and hence we give a more general definition. The encoding is based on Elias- codes:
Definition 6.2 (Elias- code [14]).
The Elias- code of a positive integer is a bitmask , where and is the -bit binary representation of (with most significant bit ).
Definition 6.3 (Sparse encoding).
The sparse encoding of a string is a bitmask that encodes from left to right as follows. Each symbol is stored as a literal token . Each inclusion-wise maximal fragment of the form for is stored as a zero-run token .
Example 6.4.
Consider string and its sparse encoding shown below. The first bit of each token indicates whether it is a literal or a zero-run . The rest of the token consists of zeros (to the left of each dotted line) and the binary representation of (to the right of each dotted line).
We note that a zero-run or a literal contributes bits to the encoding. By applying Jensen’s inequality to the concave log-function, we get the following bounds.
Observation 6.5.
For , let be the elements of , and let and . Regarding , we observe:
-
The number of bits contributed by zero-run tokens is at most
-
The number of bits contributed by literal tokens is exactly
-
If , then .
If we encode the bitmask of a synchronizing set from Theorem 5.4, then the encoding consists of bits. It is easy to see that the size of the encoding is minimized when the string is all-zero, in which case it consists of bits.
Observation 6.6.
For every and , it holds .
If a string is a prefix of another string , then the sparse encoding of is also a prefix of the sparse encoding of , unless ends with a zero-run that can be extended further in . In the latter case, the zero-run is encoded differently in and . Since the set of Elias- codes (and hence the set of possible tokens) is prefix-free, this implies that the encoding of cannot be a prefix of the encoding of .
Observation 6.7.
The following holds for every two distinct non-empty strings . The encoding is a prefix of the encoding if and only if is a prefix of and .
Parsing sparse encodings.
We introduce basic tools for sparse encodings. Computing Elias- codes can be accelerated with precomputed lookup tables. Then, we can encode and decode strings one token at a time, resulting in Lemma 6.9 below. For Lemma 6.9(ii), we merely split the computation time of Lemma 6.9(i) into preprocessing and query time.
Lemma 6.8.
For every , after an -time preprocessing, the following holds for every and . Computing from the -bit representation of and computing the -bit representation of from a bitmask with prefix can be done in time. The size of the code is also reported.
Lemma 6.9.
For every , after an -time preprocessing, the following holds for every . Let with .
-
(i)
Computing the -bit representation of from and vice versa can be done in time.
-
(ii)
If is given in -bit representation, then in time and space, one can compute a data structure that returns in time.
We can encode and decode sparse arrays (in list representation) in constant time per non-zero entry, using Lemma 6.8 to process one token at a time.
Corollary 6.10.
After an -time preprocessing, given any array as a list of its non-zero entries as position-value pairs in increasing order of position, we can output and vice versa in time.
6.1 Processing Sparse Encodings With Transducers
We will repeatedly process bitmasks, strings, and arrays in the sparse encoding. As a general tool for this task, we propose a preprocessing scheme for deterministic finite-state transducers, henceforth simply called transducers. A transducer consists of a finite set of states, an initial state , a finite alphabet , and a transition function . Given input strings , the transducer produces output string , where all strings are of common length and are over alphabet . The computation is performed in a sequence of steps. Before the -th step (with ), the transducer is in state , and it has already written . The -th step is performed by evaluating , resulting in the new state and the next symbol of the output string. Since the input strings are processed from left to right, we say that the transducer has input streams, and we call it a single-stream transducer if .
In the Theorem below, we show how to preprocess a single-stream transducer so that it can efficiently work directly on sparse encodings. For every state and every string for which is at most a small fraction of , we precompute the entire chain of transitions performed when reading in state . The result of this precomputation is the new state reached after reading , as well as the sparse encoding of the produced output. This way, for a longer input encoding, we can process up to bits in constant time.
Theorem 6.11.
Consider a single-stream transducer over alphabet with states , where . For every , if evaluating the transition function with input symbol (at any state) takes time, then after an -time preprocessing, the following holds.
If is an input string of length for which the transducer produces output , then can be computed from in time.
Proof sketch.
We follow the full proof in the full version. Fix a small constant and set to be a power of two (so ). The proof has two parts: (i) tabulate how the transducer behaves on all sparse encodings whose bit-length is , and (ii) process the remaining long tokens (especially long zero-runs) with a separate jumping mechanism.
Preprocessing.
We precompute information that lets us process bits of the input encoding in time.
-
1.
Tabulating short prefixes of sparse encodings. For every state we build a lookup table indexed by all bitmasks . For each , we find the largest prefix length such that is a sparse encoding. Let be the decoded length- string with . We simulate the transducer for steps on input , obtaining the new state and the produced output string . We then store in (besides ) a representation of that separates leading and trailing zeros: we keep the counts of leading/trailing zeros of , and build the data structure from Lemma 6.9(ii) for the middle part . This way, later we can append to the global output in time , without ever materializing it bit-by-bit. Computing a single entry takes time (decode , simulate transitions, and build ). Since implies by ˜6.6, the total for all entries is .
-
2.
Short runs of input zeros. For each state , we also build a table that stores, for , the value obtained by looking up on the -bit word that starts with the sparse encoding of the zero-run token . This allows us to advance through consecutive input zeros in one constant-time lookup. The key point is that, for , the token has length , so it fits into one lookup word together with padding. If the tables are given, then the tables can be easily constructed in time.
-
3.
Long stretches where input/output are both zero. Finally, for handling very long zero-run tokens, we build the directed graph on states in which there is an edge iff the transducer transitions from to on input and outputs . This is a pseudoforest (outdegree ), so we can preprocess it with a simple adaptation of level ancestor queries [5] such that we can “jump” in time through long chains of transitions that keep outputting zero. Computing the graph and auxiliary data structure takes time.
Running the transducer on .
Let . As an invariant, we maintain: offsets and such that , the current state reached by the transducer after processing , and an output representation consisting of (i) a counter that indicates the number of trailing zeros of and (ii) the sparse encoding . Here, is always a prefix of due to ˜6.7. We process the remaining suffix in macro-steps:
-
If returns , then we have a whole sparse encoding fitting in bits. We take the precomputed entry and update by . If the corresponding output is all-zero, we just increase . Otherwise we first flush the pending zeros by appending (if needed), then append the middle part via , and finally set . Near the end of , we pad the -bit window with an incomplete token to prevent decoding beyond .
-
Otherwise , i.e., the next token of is long (more than bits). We decode this token (and its bit length ) using Lemma 6.8. If it is a literal, we decode the symbol, evaluate one transducer transition (cost by assumption), and append the encoded output symbol using Lemma 6.8. If, however, the decoded token is a zero-run token , then we handle it in a series of micro-steps. We alternate between (a) fixed micro-steps that advance by using (so we can also handle prefixes whose output is not all-zero), and (b) flexible micro-steps that use the precomputed graph and auxiliary data structure to skip a maximal prefix of transitions that read and output (advancing and increasing ). This continues until all input zeros are consumed. Finally, regardless of whether the decoded token is a literal or a zero-run token, we advance by bits.
Once we have processed the entire , we append to , obtaining .
Correctness.
By construction, each lookup-table entry faithfully simulates the transducer on the decoded prefix it represents, so using the tables updates the current state exactly as in the real run and produces exactly the corresponding output substring. The maintained invariant ensures that after every step, the processed part of corresponds to the processed prefix of the plain input, and represents the output written so far up to the buffered trailing zeros. The only subtlety is concatenating outputs while preserving a valid sparse encoding; this is precisely why we keep trailing zeros in a counter and only flush them when the next chunk produces a non-zero output, using the prefix characterization in ˜6.7.
Time bound.
Each macro-step with advances the input encoding by a maximal sparse-encoding prefix inside a -bit window; hence, any two consecutive macro-steps advance the input encoding by more than bits (as otherwise, the steps could have been merged), and there are macro-steps.
Micro-steps only occur inside long zero-run tokens. Every flexible micro-step advances the output to the next non-zero symbol. Therefore, for four consecutive micro-steps of the form (flexible, fixed, flexible, fixed), the first output symbol produced by each of the two fixed steps is a non-zero symbol. Hence, the encoding of the output produced by the central two steps is a substring of the encoding appended to during the four steps. Also, by the definition of a fixed step, the (plain text) output corresponding to this substring is of length at least . By ˜6.6, its sparse encoding contains bits, so (ignoring initial/final micro-steps per macro-step) we get micro-steps overall. The number of initial/final micro-steps is limited by the number of macro-steps.
Finally, whenever a step takes more than constant time, it is because, for some value , we (i) use Lemma 6.9(ii) to obtain an encoding consisting of bits and append it to the output, (ii) use Lemmas 6.8 and 6.8 to decode (resp. encode) a token consisting of bits and advance the input (resp. output) by bits, or (iii) evaluate a transition on a large literal whose encoding consists of bits. Each such cost is , and it can be charged to the bits advanced in or appended to , yielding total overhead . This gives total time .
To handle multi-stream transducers, we use a reduction of multi-stream transducers to single-stream ones. For this purpose, we define a zipped string.
Definition 6.12.
Let with be strings in . The string of length has, for each , its -th symbol defined by if , and otherwise.
We stress that this zipped string is not, in itself, a sparse encoding – it is a string in which each non-zero symbol is the sparsely encoded concatenation of the corresponding symbols of the original strings. Crucially, when sparsely encoding the zipped sequence, there is only a constant factor overhead over the sparsely encoded original strings.
Lemma 6.13.
Given a constant number of equal-length strings , it holds .
Given the sparse encodings of the input strings, we first produce the sparse encoding of their zipped string. For the result below, we use similar techniques as in the proof of Theorem 6.11, processing up to bits of the input encodings in constant time by exploiting precomputed information. Unlike in the proof of Theorem 6.11, a long synchronized run of zeros in the input strings always leads to a run of zeros in the output, simplifying the algorithm to some extent. However, non-synchronized runs of zeros pose an additional challenge, as described in detail in the full version.
Theorem 6.14.
For every , after an -time preprocessing, the following holds. If with and , then can be computed from in time.
Finally, there is an obvious reduction from a transducer with input strings to a single-stream transducer that receives the zipped version of the input strings. By applying Theorem 6.11 to this single-stream transducer, we obtain the following result.
Corollary 6.15.
Consider a transducer over alphabet with states , where , and input streams. If the transition function can be evaluated in time, then, for any , after an -time preprocessing, the following holds.
Let be input strings of common length for which the transducer produces output . Then can be computed from in time.
6.2 Faster Synchronizing Set Queries
Using Corollary 6.15, we obtain sparsely encoded versions of the sets , of and , and finally of a -synchronizing set. Ultimately, we derive the following.
Theorem 6.16.
A string can be preprocessed in time so that, given , a -synchronizing set of of size can be constructed in time and bits of space. The set is reported as for such that . Moreover, holds for every .
6.3 Adding Rank and Select Support
Theorem 6.16 returns the synchronizing set in sparse encoding, which by itself does not allow fast random access. Hence, we develop support data structures that augment the encoding for fast rank and select queries. For any set and , we define and . For every , we define . For and its characteristic bitmask , we may equivalently use subscript rather than .
We can use a precomputed lookup table to greedily parse any encoding into pieces of size around bits, and then use another table to answer rank and select queries with respect to any piece in constant time. This is formalized below.
Lemma 6.17.
For every and every bitmask , there is a sequence with satisfying the following properties. The entries are defined by , , , and, for ,
-
and , and
-
either is all-zero, or .
After a time preprocessing, the following holds. Given , the sequence can be computed in time and bits of space. In the same time and space, we can compute a data structure that,
-
given and , returns in constant time, and
-
given and , returns in constant time.
Now, to answer a query , we only have to find the unique tuple of the decomposition with . This can be done via two auxiliary bitmasks of length that respectively mark the starting positions of literal tokens in and the positions of all the tuples. Then, we can find the correct tuples via rank and select queries on the auxiliary bitmasks. Crucially, we can use existing data structures for constant time rank and select support on these bitmasks [4].
Lemma 6.18.
For every , after a time preprocessing, the following holds. Given a sparse encoding of a bitmask with and , we can compute a data structure for time select queries in time and bits of space.
For implementing rank support, we rely on an improved version of van Emde Boas trees [42] given in the Theorem below. It is well known that the claimed complexities can be achieved with expected construction time and space [33, 34]. Our deterministic solution can be obtained by essentially replacing the hash tables of van Emde Boas trees with deterministic dictionaries [37]. For completeness, we give a detailed description in the full version.
Theorem 1.3. [Restated, see original statement.]
Let of size with and be given as an array of -bit integers in increasing order. For , let . A deterministic data structure that answers rank and predecessor queries in time can be built in time and words of space.
We construct this data structure for the sequence from Lemma 6.17, simulating words of width . This way, for a query , we can find the unique such that , allowing us to answer the query with Lemma 6.17.
Lemma 6.19.
For every , after a time preprocessing, the following holds. Given a sparse encoding of a bitmask with and a parameter , we can compute a data structure for time rank and predecessor queries in time and bits of space.
Finally, by combining Theorem 6.16 with Lemma 6.18 and Lemma 6.19 with parameter , we obtain the following main result.
Corollary 6.20.
A string can be preprocessed in time so that, given , a -synchronizing set of of size can be constructed in time. The set is reported in a representation of size bits that supports select queries in constant time, and rank queries in time.
References
- [1] Shyan Akmal and Ce Jin. Near-optimal quantum algorithms for string problems. Algorithmica, 85(8):2260–2317, 2023. doi:10.1007/S00453-022-01092-X.
- [2] Mai Alzamel, Maxime Crochemore, Costas S. Iliopoulos, Tomasz Kociumaka, Jakub Radoszewski, Wojciech Rytter, Juliusz Straszynski, Tomasz Waleń, and Wiktor Zuba. Quasi-linear-time algorithm for longest common circular factor. In Nadia Pisanti and Solon P. Pissis, editors, 30th Annual Symposium on Combinatorial Pattern Matching, CPM 2019, June 18-20, 2019, Pisa, Italy, volume 128 of LIPIcs, pages 25:1–25:14. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2019. doi:10.4230/LIPIcs.CPM.2019.25.
- [3] Lorraine A. K. Ayad, Grigorios Loukides, and Solon P. Pissis. Text indexing for long patterns using locally consistent anchors. VLDB J., 34(5):58, 2025. doi:10.1007/S00778-025-00935-7.
- [4] Maxim A. Babenko, Paweł Gawrychowski, Tomasz Kociumaka, and Tatiana Starikovskaya. Wavelet trees meet suffix trees. In Piotr Indyk, editor, Proceedings of the Twenty-Sixth Annual ACM-SIAM Symposium on Discrete Algorithms, SODA 2015, San Diego, CA, USA, January 4-6, 2015, pages 572–591. SIAM, 2015. doi:10.1137/1.9781611973730.39.
- [5] Michael A. Bender and Martin Farach-Colton. The level ancestor problem simplified. Theor. Comput. Sci., 321(1):5–12, 2004. doi:10.1016/J.TCS.2003.05.002.
- [6] Or Birenzwige, Shay Golan, and Ely Porat. Locally consistent parsing for text indexing in small space. In Shuchi Chawla, editor, Proceedings of the 2020 ACM-SIAM Symposium on Discrete Algorithms, SODA 2020, Salt Lake City, UT, USA, January 5-8, 2020, pages 607–626. SIAM, 2020. doi:10.1137/1.9781611975994.37.
- [7] Christina Boucher, Travis Gagie, Alan Kuhnle, Ben Langmead, Giovanni Manzini, and Taher Mun. Prefix-free parsing for building big BWTs. Algorithms Mol. Biol., 14(1):13:1–13:15, 2019. doi:10.1186/S13015-019-0148-5.
- [8] Panagiotis Charalampopoulos, Tomasz Kociumaka, Solon P. Pissis, and Jakub Radoszewski. Faster algorithms for longest common substring. In Petra Mutzel, Rasmus Pagh, and Grzegorz Herman, editors, 29th Annual European Symposium on Algorithms, ESA 2021, September 6-8, 2021, Lisbon, Portugal (Virtual Conference), volume 204 of LIPIcs, pages 30:1–30:17. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2021. doi:10.4230/LIPIcs.ESA.2021.30.
- [9] Panagiotis Charalampopoulos, Manal Mohamed, Jakub Radoszewski, Wojciech Rytter, Tomasz Waleń, and Wiktor Zuba. Counting distinct square substrings in sublinear time. In Paweł Gawrychowski, Filip Mazowiecki, and Michal Skrzypczak, editors, 50th International Symposium on Mathematical Foundations of Computer Science, MFCS 2025, August 25-29, 2025, Warsaw, Poland, volume 345 of LIPIcs, pages 36:1–36:19. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2025. doi:10.4230/LIPIcs.MFCS.2025.36.
- [10] Panagiotis Charalampopoulos, Solon P. Pissis, and Jakub Radoszewski. Longest palindromic substring in sublinear time. In Hideo Bannai and Jan Holub, editors, 33rd Annual Symposium on Combinatorial Pattern Matching, CPM 2022, June 27-29, 2022, Prague, Czech Republic, volume 223 of LIPIcs, pages 20:1–20:9. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2022. doi:10.4230/LIPIcs.CPM.2022.20.
- [11] Graham Cormode and S. Muthukrishnan. Substring compression problems. In Proceedings of the Sixteenth Annual ACM-SIAM Symposium on Discrete Algorithms, SODA 2005, Vancouver, British Columbia, Canada, January 23-25, 2005, pages 321–330. SIAM, 2005. URL: http://dl.acm.org/citation.cfm?id=1070432.1070478.
- [12] Graham Cormode and S. Muthukrishnan. The string edit distance matching problem with moves. ACM Trans. Algorithms, 3(1):2:1–2:19, 2007. doi:10.1145/1219944.1219947.
- [13] Patrick Dinklage, Johannes Fischer, Alexander Herlez, Tomasz Kociumaka, and Florian Kurpicz. Practical performance of space efficient data structures for longest common extensions. In Fabrizio Grandoni, Grzegorz Herman, and Peter Sanders, editors, 28th Annual European Symposium on Algorithms, ESA 2020, September 7-9, 2020, Pisa, Italy (Virtual Conference), volume 173 of LIPIcs, pages 39:1–39:20. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2020. doi:10.4230/LIPIcs.ESA.2020.39.
- [14] Peter Elias. Universal codeword sets and representations of the integers. IEEE Trans. Inf. Theory, 21(2):194–203, 1975. doi:10.1109/TIT.1975.1055349.
- [15] Jonas Ellert. Sublinear time Lempel-Ziv (LZ77) factorization. In Franco Maria Nardini, Nadia Pisanti, and Rossano Venturini, editors, String Processing and Information Retrieval - 30th International Symposium, SPIRE 2023, Pisa, Italy, September 26-28, 2023, Proceedings, volume 14240 of Lecture Notes in Computer Science, pages 171–187. Springer, 2023. doi:10.1007/978-3-031-43980-3_14.
- [16] N. J. Fine and H. S. Wilf. Uniqueness theorems for periodic functions. Proceedings of the American Mathematical Society, 16:109–114, 1965. doi:10.1090/S0002-9939-1965-0174934-9.
- [17] Ragnar Groot Koerkamp. Optimal Throughput Bioinformatics. PhD thesis, ETH Zurich, 2025. doi:10.3929/ethz-c-000783091.
- [18] Torben Hagerup. Sorting and searching on the word RAM. In Michel Morvan, Christoph Meinel, and Daniel Krob, editors, STACS 98, 15th Annual Symposium on Theoretical Aspects of Computer Science, Paris, France, February 25-27, 1998, Proceedings, volume 1373 of Lecture Notes in Computer Science, pages 366–398. Springer, 1998. doi:10.1007/BFB0028575.
- [19] Artur Jeż. Approximation of grammar-based compression via recompression. Theor. Comput. Sci., 592:115–134, 2015. doi:10.1016/J.TCS.2015.05.027.
- [20] Artur Jeż. Recompression: A simple and powerful technique for word equations. J. ACM, 63(1):4:1–4:51, 2016. doi:10.1145/2743014.
- [21] Ce Jin and Jakob Nogler. Quantum speed-ups for string synchronizing sets, longest common substring, and k-mismatch matching. ACM Trans. Algorithms, 20(4):32:1–32:36, 2024. doi:10.1145/3672395.
- [22] Dominik Kempa and Tomasz Kociumaka. String synchronizing sets: sublinear-time BWT construction and optimal LCE data structure. In Moses Charikar and Edith Cohen, editors, Proceedings of the 51st Annual ACM SIGACT Symposium on Theory of Computing, STOC 2019, Phoenix, AZ, USA, June 23-26, 2019, pages 756–767. ACM, 2019. doi:10.1145/3313276.3316368.
- [23] Dominik Kempa and Tomasz Kociumaka. Dynamic suffix array with polylogarithmic queries and updates. In Stefano Leonardi and Anupam Gupta, editors, STOC ’22: 54th Annual ACM SIGACT Symposium on Theory of Computing, Rome, Italy, June 20 - 24, 2022, pages 1657–1670. ACM, 2022. doi:10.1145/3519935.3520061.
- [24] Dominik Kempa and Tomasz Kociumaka. Resolution of the Burrows-Wheeler transform conjecture. Commun. ACM, 65(6):91–98, 2022. doi:10.1145/3531445.
- [25] Dominik Kempa and Tomasz Kociumaka. Breaking the -barrier in the construction of compressed suffix arrays and suffix trees. In Nikhil Bansal and Viswanath Nagarajan, editors, Proceedings of the 2023 ACM-SIAM Symposium on Discrete Algorithms, SODA 2023, Florence, Italy, January 22-25, 2023, pages 5122–5202. SIAM, 2023. doi:10.1137/1.9781611977554.CH187.
- [26] Dominik Kempa and Tomasz Kociumaka. Lempel-Ziv (LZ77) factorization in sublinear time. In 65th IEEE Annual Symposium on Foundations of Computer Science, FOCS 2024, Chicago, IL, USA, October 27-30, 2024, pages 2045–2055. IEEE, 2024. doi:10.1109/FOCS61266.2024.00122.
- [27] Tomasz Kociumaka, Jakub Radoszewski, Wojciech Rytter, and Tomasz Waleń. Internal pattern matching queries in a text and applications. In Piotr Indyk, editor, Proceedings of the Twenty-Sixth Annual ACM-SIAM Symposium on Discrete Algorithms, SODA 2015, San Diego, CA, USA, January 4-6, 2015, pages 532–551. SIAM, 2015. doi:10.1137/1.9781611973730.36.
- [28] Tomasz Kociumaka, Jakub Radoszewski, Wojciech Rytter, and Tomasz Waleń. Internal pattern matching queries in a text and applications. SIAM J. Comput., 53(5):1524–1577, 2024. doi:10.1137/23M1567618.
- [29] Roman M. Kolpakov and Gregory Kucherov. Finding maximal repetitions in a word in linear time. In 40th Annual Symposium on Foundations of Computer Science, FOCS 1999, New York, NY, USA, October 17-18, 1999, pages 596–604. IEEE Computer Society, 1999. doi:10.1109/SFFCS.1999.814634.
- [30] Grigorios Loukides and Solon P. Pissis. Bidirectional string anchors: A new string sampling mechanism. In Petra Mutzel, Rasmus Pagh, and Grzegorz Herman, editors, 29th Annual European Symposium on Algorithms, ESA 2021, September 6-8, 2021, Lisbon, Portugal (Virtual Conference), volume 204 of LIPIcs, pages 64:1–64:21. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2021. doi:10.4230/LIPIcs.ESA.2021.64.
- [31] Mamoru Maekawa. A square root N algorithm for mutual exclusion in decentralized systems. ACM Trans. Comput. Syst., 3(2):145–159, 1985. doi:10.1145/214438.214445.
- [32] Kurt Mehlhorn, R. Sundar, and Christian Uhrig. Maintaining dynamic sequences under equality tests in polylogarithmic time. Algorithmica, 17(2):183–198, 1997. doi:10.1007/BF02522825.
- [33] Mihai Pătraşcu and Mikkel Thorup. Time-space trade-offs for predecessor search. In Jon M. Kleinberg, editor, Proceedings of the 38th Annual ACM Symposium on Theory of Computing, Seattle, WA, USA, May 21-23, 2006, pages 232–240. ACM, 2006. doi:10.1145/1132516.1132551.
- [34] Mihai Pătraşcu and Mikkel Thorup. Time-space trade-offs for predecessor search, 2006. doi:10.48550/arXiv.cs/0603043.
- [35] Jakub Radoszewski and Wiktor Zuba. Computing string covers in sublinear time. In Zsuzsanna Lipták, Edleno Silva de Moura, Karina Figueroa, and Ricardo Baeza-Yates, editors, String Processing and Information Retrieval - 31st International Symposium, SPIRE 2024, Puerto Vallarta, Mexico, September 23-25, 2024, Proceedings, volume 14899 of Lecture Notes in Computer Science, pages 272–288. Springer, 2024. doi:10.1007/978-3-031-72200-4_21.
- [36] Michael Roberts, Wayne Hayes, Brian R. Hunt, Stephen M. Mount, and James A. Yorke. Reducing storage requirements for biological sequence comparison. Bioinformatics, 20(18):3363–3369, 2004. doi:10.1093/bioinformatics/bth408.
- [37] Milan Ruzic. Constructing efficient dictionaries in close to sorting time. In Luca Aceto, Ivan Damgård, Leslie Ann Goldberg, Magnús M. Halldórsson, Anna Ingólfsdóttir, and Igor Walukiewicz, editors, Automata, Languages and Programming, 35th International Colloquium, ICALP 2008, Reykjavik, Iceland, July 7-11, 2008, Proceedings, Part I: Track A: Algorithms, Automata, Complexity, and Games, volume 5125 of Lecture Notes in Computer Science, pages 84–95. Springer, 2008. doi:10.1007/978-3-540-70575-8_8.
- [38] Süleyman Cenk Sahinalp and Uzi Vishkin. On a parallel-algorithms method for string matching problems. In Maurizio A. Bonuccelli, Pierluigi Crescenzi, and Rossella Petreschi, editors, Algorithms and Complexity, Second Italian Conference, CIAC ’94, Rome, Italy, February 23-25, 1994, Proceedings, volume 778 of Lecture Notes in Computer Science, pages 22–32. Springer, 1994. doi:10.1007/3-540-57811-0_3.
- [39] Süleyman Cenk Sahinalp and Uzi Vishkin. Symmetry breaking for suffix tree construction. In Frank Thomson Leighton and Michael T. Goodrich, editors, Proceedings of the Twenty-Sixth Annual ACM Symposium on Theory of Computing, 23-25 May 1994, Montréal, Québec, Canada, pages 300–309. ACM, 1994. doi:10.1145/195058.195164.
- [40] Süleyman Cenk Sahinalp and Uzi Vishkin. Efficient approximate and dynamic matching of patterns using a labeling paradigm (extended abstract). In 37th Annual Symposium on Foundations of Computer Science, FOCS 1996, Burlington, Vermont, USA, 14-16 October, 1996, pages 320–328. IEEE Computer Society, 1996. doi:10.1109/SFCS.1996.548491.
- [41] Saul Schleimer, Daniel Shawcross Wilkerson, and Alex Aiken. Winnowing: Local algorithms for document fingerprinting. In Alon Y. Halevy, Zachary G. Ives, and AnHai Doan, editors, Proceedings of the 2003 ACM SIGMOD International Conference on Management of Data, San Diego, California, USA, June 9-12, 2003, pages 76–85. ACM, 2003. doi:10.1145/872757.872770.
- [42] Peter van Emde Boas. Preserving order in a forest in less than logarithmic time. In 16th Annual Symposium on Foundations of Computer Science, Berkeley, California, USA, October 13-15, 1975, pages 75–84. IEEE Computer Society, 1975. doi:10.1109/SFCS.1975.26.
