<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>KMP Based Pattern Matching Algorithms for Multi-Track Strings</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Diptarama</string-name>
          <email>fdiptarama@shino</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Yohei Ueki</string-name>
          <email>ueki@shino</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Kazuyuki Narisawa</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Ayumi Shinohara</string-name>
          <email>ayumi@gecei.tohoku.ac.jp</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Graduate School of Information Sciences, Tohoku University</institution>
          ,
          <country country="JP">Japan</country>
        </aff>
      </contrib-group>
      <fpage>100</fpage>
      <lpage>107</lpage>
      <abstract>
        <p>Multi-track string is an N -tuple strings of length n. For two multi-track strings T = (t1; t2; : : : ; tN ) of length n and P = (p1; p2; :::; pM ) of length m, permuted pattern matching is a problem to nd all positions i such that P is permuted match with T[i : i + M ]. We propose three new algorithms for permuted pattern matching based on the KMP algorithm. The rst algorithm is an exact matching algorithm that runs in O(nN ) time after O(mM )-time preprocessing. The second and third algorithms are ltering algorithms that run in O(n(N + )) after O(m(M + ))time preprocessing, where is the size of alphabet. Experiments show that our algorithms run faster than AC automaton based algorithm that proposed by Katsura et al. [5].</p>
      </abstract>
      <kwd-group>
        <kwd>string matching</kwd>
        <kwd>multi-track</kwd>
        <kwd>KMP algorithm</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>
        Pattern matching problem on strings is de ned as nding all occurences of
a pattern string in a text string. Many of pattern matching algorithms can nd
occurences of the pattern fast by preprocessing the pattern such as AC
automaton [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], and KMP algorithm [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], or by constructing data structure from the text
such as suffix tree [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], suffix array [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], and position heap [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ].
      </p>
      <p>
        Katsura et al. [
        <xref ref-type="bibr" rid="ref5 ref6">5, 6</xref>
        ] de ned a set (or tuple) of strings be a multi-track string,
and formulated the pattern matching problem on multi-track strings, called
permuted pattern matching. In order to solve this problem, they proposed permuted
pattern matching algorithms by constructing data structure from text such as
multi-track suffix tree [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], multi-track position heap [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], or by preprocessing the
the pattern such as AC automaton based algorithm [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>
        In this paper, we propose three new algorithms for multi-track pattern
matching problem, based on KMP algorithm [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]1. The rst one is a full-permuted
pattern matching algorithm, that we call it MTKMP for short. Second and third are
ltering algorithms for multi-track full- and sub- permuted matching problem,
respectively. For short, we call them Filter-MTKMP-Full and Filter-MTKMP,
respectively. Different with AC automaton based algorithm [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] that constructs
1 We implement MP algorithm for the rst algorithm and KMP algorithm for the
second and third algorithms.
failure functions for each track of the pattern, our algorithms only construct
one failure function for a multi-track pattern. Also, our algorithms match the
whole tracks of the pattern to the text instead of matching each track of the
text independently.
      </p>
      <p>
        We show that MTKMP runs in O(mM ) time for constructing the failure
function, and O(nN ) for matching. Both Filter-MTKMP-Full and Filter-MTKMP
run in O(m(M + )) time for constructing the failure function, O(n(N + )) for
ltering, and O(mM ) to verify each candidate. Moreover, the experiment results
show that proposed algorithms run faster than AC automaton based multi-track
pattern matching algorithm [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] for full-permuted matching, and Filter-MTKMP
works faster on sub-permuted-matching when the alphabet size and the track
count of the pattern are large.
2
      </p>
    </sec>
    <sec id="sec-2">
      <title>Preliminaries</title>
      <p>Let w 2 n be a string of length n over an alphabet , and = j j be the
alphabet size. jwj denotes the length of w and w[i] denotes i-th character of w.
The substring of w that begins at position i and ends at position j is denoted
by w[i : j] for 1 i j jwj. In addition, w[: i] = w[1 : i] and w[i :] = w[i : jwj]
denotes a pre x and a suffix of w, respectively. For two strings x and y, x ≺ y
denotes that x is lexicographically smaller than y, and x ≼ y denotes that either
x equals to y or x ≺ y.</p>
      <p>A multi-track string (or multi-track for short) W = (w1; w2; :::; wN ) is an
N -tuple of strings wi 2 n, and each wi is called the i-th track of W. The
length n of a multi-track is denoted by jWjlen . The number N of tracks in
a multi-track is called track count and denoted by jWjnum . For two multi-tracks
X = (x1; x2; ::; xN ) and Y = (y1; y2; ::; yN ), we write X = Y if xi = yi for
1 i N . W[i] denotes (w1[i]; w2[i]; :::wN [i]), and W[i : j] denotes (w1[i :
j]; w2[i : j]; : : : ; wN [i : j]) for 1 i j jWjlen . Moreover, the pre x and suffix
of W are denoted by W[: i] = W[1 : i] and W[i :] = W[i : jWjlen ], respectively.</p>
      <p>Let r = (r1; r2; : : : ; rM ) be a partial permutation of (1; 2; : : : ; N ) for M N .
For a multi-track W = (w1; w2; : : : ; wN ), a permuted multi-track of W is denoted
by either W⟨r1; r2; : : : ; rM ⟩ or W⟨r⟩. Sorted index of a multi track SI(W) =
(r1; r2; : : : ; rN ) is de ned as a permutation such that wri ≼ wrj for any 1 i
j N . For two multi-tracks X = (x1; x2; : : : ; xM ) and Y = (y1; y2; : : : ; yN ), X
◃▹
permuted-matches Y, denoted by X ⊑ Y, if 9r:X = Y⟨r⟩, and X
full-permutedmatches Y, denoted by X =◃▹ Y, if M = N and 9r:X = Y⟨r⟩.</p>
      <p>Throughout the paper, we assume that P is a pattern with jPjnum = M and
jPjlen = m, and T is a text with jTjnum = N and jTjlen = n. The pattern
matching problem on multi-tracks are de ned as follows.</p>
      <p>Problem 1 (Permuted pattern matching). Given a multi-tracks text T and
a multi-track pattern P, output all positions i that satisfy P ⊑◃▹ T[i : i + m 1].
Moreover, we call it full-permuted pattern matching if M = N , and sub-permuted
pattern matching if M &lt; N .</p>
      <p>Algorithm 1: MTKMP pattern matching algorithm</p>
      <p>Input: Multi-track T, Multi-track P</p>
      <p>
        Output: match positions
1 compute SI (T[i :]) for 1 i n and SI (P[i :]) for 1 i m;
2 constructFailureFunction();
3 i = 1; j = 1;
4 while i n do
5 while j &gt; 0 and T[i]⟨SI (T[i j + 1 :])⟩ ̸= P[j]⟨SI (P[1 :])⟩ do j = F [j];
6 i = i + 1; j = j + 1;
7 if j &gt; m then
8 output (i j + 1);
9 j = F [j];
10 Function constructFailureFunction()
11 i = 1; j = 1; F [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] = 0;
12 while i m do
13 while j &gt; 0 and P[j]⟨SI (P[1 :])⟩ ̸= P[i]⟨SI (T[i j + 1 :])⟩ do j = F [j];
14 i = i + 1; j = j + 1;
15 F [i] = j;
      </p>
      <p>In this section, we propose an algorithm for full-permuted pattern
matching that based on KMP algorithm, named multi-track KMP algorithm (shortly
MTKMP). In a similar manner to the original KMP algorithm, MTKMP
constructs the failure function from the pattern, then uses it to shift the pattern
when mismatch occurs. The MTKMP algorithm is described in Algorithm 1.</p>
      <p>
        The failure function F [i] for 1 i m+1 in MTKMP is de ned as the length
of the longest proper suffix of P[1 : i 1] that permuted-matches with a pre x of
P, except F [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] = 0 and F [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] = 1. In order to construct the failure function, rst
MTKMP nds the value of sorted index SI (P[i : m]) for all 1 i m. Then
permuted-matching of suffix P[j : i] and pre x P[1 : i j + 1] is performed by
using SI (P[1 :]) and SI (P[j :]).
      </p>
      <p>MTKMP performs permuted pattern matching from left to right of the
pattern and the text. Sorted indexes of the text and the pattern are used to perform
permuted-matching between the pattern and a substring of the text. If characters
on text and pattern are mismatched, then we shift the position of the pattern by
using the failure function. If the pattern matches a substring of the text, then
MTKMP outputs the position of the text and shifts the pattern according to
the failure function.</p>
      <p>
        The MTKMP algorithm runs in O(mM ) time for constructing the failure
function and O(nN ) time for matching. Suffix index SI (P[i :]) for 1 i m
and SI (T[i :]) for 1 i n can be computed in O(mM ) and O(nN ) respectively
by using suffix tree [
        <xref ref-type="bibr" rid="ref10 ref12 ref13 ref3">3, 10, 12, 13</xref>
        ] or suffix array [
        <xref ref-type="bibr" rid="ref11 ref4 ref8 ref9">4, 8, 9, 11</xref>
        ]. Next, both the outer
while loop and the inner while loop are called O(m) times, since the i j
i m + 1 and the value of i always increase each time the outer loop is called,
and the value of i j always increases each time the inner loop is called. Since
Algorithm 2: Filter-MTKMP-Full pattern matching algorithm
Input: Multi-track T, Multi-track P
      </p>
      <p>
        Output: match position
1 T′ = func(T); P′ = func(P);
2 constructFailureFunction();
3 i = 1, j = 1;
4 while i n do
5 while j &gt; 0 and T′[i] ̸= P′[j] do j = F [j];
6 i = i + 1; j = j + 1;
7 if j &gt; m then
8 if T[i j + 1 : i 1] ⊑◃▹ P then output (i j + 1);
9 j = F [j];
10 Function constructFailureFunction()
11 i = 1; j = 1; F [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] = 0;
12 while i m do
13 while j &gt; 0 and P′[i] ̸= P′[j] do j = F [j];
14 i = i + 1; j = j + 1;
15 if i m and P′[i] = P′[j] then F [j] = F [i]; else F [j] = i;
a comparison of P[j]⟨SI (P[1 :])⟩ and P[i]⟨SI (T[i j + 1 :])⟩ consumes O(M ) time,
constructFailureFunction function runs in O(M m) time. In a similar way, the
search algorithm of MTKMP runs in O(N n) time.
3
      </p>
    </sec>
    <sec id="sec-3">
      <title>KMP Algorithm for Filtering on Multi-Track String</title>
      <p>In this section we propose two ltering algorithms that can outperform MTKMP
for permuted pattern matching problems. Instead of the suffix index, we use
simple functions to transforms the multi-track string, that can be computed
faster than the suffix index. Then, by transforming the pattern and the text,
the KMP algorithm can be applied to nd candidates of permuted-matching
positions. Finally, every candidate position is checked whether or not the pattern
is permuted-matched in each position.</p>
      <p>The rst algorithm is an algorithm for full-permuted pattern matching
problem called Filter-MTKMP-Full. We use two functions in this algorithm.
Generally, we can implement another function that has a false positive property.
The second algorithm, Filter-MTKMP is an algorithm for both full- and
subpermuted pattern matching problems. Filter-MTKMP transforms multi-track
into alphabet bucket and implements KMP algorithm to it.
3.1</p>
      <sec id="sec-3-1">
        <title>Full-Permuted Pattern Matching Algorithm</title>
        <p>The Filter-MTKMP-Full algorithm is described in Algorithm 2. First, we
transform P by a function func() that has a false-positive property, that is if X =◃▹ Y
then func(X) = func(Y). We propose two functions, sort () and bucket ().</p>
        <p>De nition 1. For Z = (z1; z2; : : : ; zN ), sort (Z) = Z′ = (z1′; z2′; : : : ; zN′ ) such
that 9r:Z′[i] = Z[i]⟨r⟩ and zj′[i] ≼ zj′+1[i] for 1 i jZjlen and 1 j &lt; N .
De nition 2. For Z = (z1; z2; : : : ; zN ), bucket (Z) = (b1; b2; : : : ; b ) such that
bj[i] is the number of the lexicographical j-th character in Z[i].</p>
        <p>For example, for a multi-track Z = (abab; bbac; aabb; cabb; abba), the sort (Z)
and bucket (Z) are de ned as follows,
0 a b a b 1 0 a a a a 1</p>
        <p>B b b a c C B a a a b C 0 3 2 2 1 1
Z = BB a a b b CC ; sort (Z) = BB a b b b CC ; bucket (Z) = @ 1 3 3 3 A :
B@ c a b b CA B@ b b b b CA 1 0 0 1</p>
        <p>a b b a c b b c
For a multi-track Z, sort (Z) can be computed in O(n(N + )) by using the
bucket sorting algorithm, and bucket (Z) can be computed in O(nN ) time by
counting all characters in Z even if naively.</p>
        <p>Next, Filter-MTKMP-Full constructs the failure function F of the
transformed multi-track P′ by similar algorithm as the KMP algorithm.</p>
        <p>Pattern matching in Filter-MTKMP-Full is performed on P′ and T′. When
unmatched is occurred, the pattern is shifted by using the failure function. If
P′ matches to T′[i : j], then the algorithm checks whether the pattern P is
permuted-matched with T[i : j] or not, and outputs it if the pattern is
permutedmatched.</p>
        <p>In the same way as described in MTKMP, the failure function can be
constructed in O(m(M + )) time and the ltering algorithm runs in O(n(N + ))
time, since sort () and bucket () needs O(M ) and O( ) time for each
comparison, respectively. Also, the Filter-MTKMP-Full algorithm runs in O(m(M + ))
time for constructing the failure function. In addition, Filter-MTKMP-Full need
O(cmM ) time for checking the candidates, where c is the number of candidates.
3.2</p>
      </sec>
      <sec id="sec-3-2">
        <title>Permuted Pattern Matching Algorithm</title>
        <p>Filter-MTKMP algorithm is an extended version of the Filter-MTKMP-Full
algorithm that can be applied to the sub-permuted pattern matching problem.
This algorithm uses bucket () to transforms the pattern and the text, and
implement the KMP algorithm to the transformed pattern and text. Moreover, this
algorithm uses diff (X; Y ) function instead of X ̸= Y to loosen the condition,
thus sub-permuted pattern matching can be performed.</p>
        <p>Algorithm 3 shows a pseudocode of the Filter-MTKMP algorithm. First, it
transforms P to multi-track bucket P′ and constructs the failure function F of the
multi-track bucket by using a function diff (X; Y ) = ∑i=1 max(0; Y [i] X[i])
for two integer vectors X and Y . Then, it nds candidates of matched position
by using the failure function.</p>
        <p>Last, in the similar way as Filter-MTKMP-Full, the Filter-MTKMP
algorithm runs in O(m(M + )) time for constructing the failure function, O(n(N +
Algorithm 3: Filter-MTKMP pattern matching algorithm</p>
        <p>Input: Multi-track T, Multi-track P</p>
        <p>
          Output: match position
1 T′ = bucket (T); P′ = bucket (P);
2 constructFailureFunction();
3 i = 1; j = 1;
4 while i n do
5 while j &gt; 0 and diff (P′[j]; T′[i]) &gt; 0 do j = F [j];
6 i = i + 1; j = j + 1;
7 if j &gt; m then
8 if T[i j + 1 : i 1] ⊑◃▹ P then output (i j + 1);
9 j = F [j];
10 Function constructFailureFunction()
11 i = 1; j = 1; F [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ] = 0;
12 while i m do
13 while j &gt; 0 and diff (P′[i]; P′[j]) &gt; N M do j = F [j];
14 i = i + 1; j = j + 1;
15 if i m and P′[i] = P′[j] then F [j] = F [i]; else F [j] = i;
16 Function diff (Vector X, Vector Y )
17 Int sum = 0;
18 for k = 1 to jXj do
19 sum = sum + max(0; Y [k]
        </p>
        <p>X[k]);
20</p>
        <p>return sum;
)) time for nding candidates, and O(cmM ) time for checking the candidates,
where c is the number of candidates.
4</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Experiments</title>
      <p>
        In order to evaluate the performance of proposed algorithms, we conduct
experiments and compare the running time of proposed algorithms with AC automaton
based algorithm [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>In the rst experiment, we compare running time of the algorithms for solving
full-permuted pattern matching. We change one of the parameters while keeping
other parameters constant. We set constant parameter as follows, n = 100000,
m = 10, N = M = 1000, and = 2. We use random text and pattern with 50
occurrences of the pattern inserted to the text. Figure 1 (a)-(d) show running
time of the algorithms when one of the parameters n, N , m, and is changed
respectively. We can see that the proposed algorithms are faster than AC
automaton based algorithm. However, many false positive candidates are found
when the length of the pattern is short, and ltering algorithms need lots of
time to verify them.</p>
      <p>The second experiment measures the running time of Filter-MTKMP on
subpermuted pattern matching, and compares it with AC automaton algorithm. We
set n = 10000, N = 1000, m = 10, M = 600, and = 26 as constant parameters.
Figure 2 (a) and (b) show that running time of Filter-MTKMP is decreased when
the track count of the pattern and the alphabet size are increased, because the
number of false-positive candidates are decreased if the track count is increased.
We can conclude that Filter-MTKMP performs better if the difference between
track count of the text and track count of the pattern is small, also when the
alphabet size is large.
5</p>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>We proposed three algorithms based on the KMP algorithm, that are MTKMP,
Filter-MTKMP-Full and Filter-MTKMP. These algorithms can solve the
permuted pattern matching problem in linear time. We also conducted
computational experiments, and showed that proposed algorithms work faster than
AC-automaton based algorithm.</p>
      <p>Acknowledgments. This work was partly supported by KAKENHI Grant
Numbers 15H05706, 25560067 and 25240003. This work was also supported by
research grant and scholarship from Tohoku University Division for International
Advanced Research and Education.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Aho</surname>
            ,
            <given-names>A.V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Corasick</surname>
            ,
            <given-names>M.J.:</given-names>
          </string-name>
          <article-title>Efficient string matching: an aid to bibliographic search</article-title>
          .
          <source>Communications of the ACM</source>
          <volume>18</volume>
          (
          <issue>6</issue>
          )
          <fpage>333</fpage>
          {
          <fpage>340</fpage>
          (
          <year>1975</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Ehrenfeucht</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>McConnell</surname>
            ,
            <given-names>R.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Osheim</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Woo</surname>
            ,
            <given-names>S.W.</given-names>
          </string-name>
          :
          <article-title>Position heaps: A simple and dynamic text indexing data structure</article-title>
          .
          <source>Journal of Discrete Algorithms</source>
          <volume>9</volume>
          (
          <issue>1</issue>
          )
          <fpage>100</fpage>
          {
          <fpage>121</fpage>
          (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Farach</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Optimal suffix tree construction with large alphabets</article-title>
          .
          <source>In: FOCS</source>
          .
          <volume>137</volume>
          {
          <issue>143</issue>
          (
          <year>1997</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4. Karkkainen, J.,
          <string-name>
            <surname>Sanders</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Simple linear work suffix array construction</article-title>
          .
          <source>In: ICALP</source>
          .
          <volume>943</volume>
          {
          <issue>955</issue>
          (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Katsura</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Narisawa</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shinohara</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bannai</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Inenaga</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Permuted pattern matching on multi-track strings</article-title>
          .
          <source>In: SOFSEM</source>
          .
          <volume>280</volume>
          {
          <issue>291</issue>
          (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Katsura</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Otomo</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Narisawa</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shinohara</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Position heaps for permuted pattern matching on multi-track strings</article-title>
          .
          <source>In: Proceedings of Student Research Forum Papers and Posters at SOFSEM</source>
          <year>2015</year>
          .
          <volume>41</volume>
          {
          <issue>531</issue>
          (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Knuth</surname>
            ,
            <given-names>D.E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jr.</surname>
            ,
            <given-names>J.H.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pratt</surname>
            ,
            <given-names>V.R.</given-names>
          </string-name>
          :
          <article-title>Fast pattern matching in strings</article-title>
          .
          <source>SIAM Journal on Computing</source>
          <volume>6</volume>
          (
          <issue>2</issue>
          )
          <fpage>323</fpage>
          {
          <fpage>350</fpage>
          (
          <year>1977</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Ko</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Aluru</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Space efficient linear time construction of suffix arrays</article-title>
          .
          <source>In: CPM</source>
          .
          <volume>200</volume>
          {
          <issue>210</issue>
          (
          <year>2003</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Manber</surname>
            ,
            <given-names>U.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Myers</surname>
          </string-name>
          , G.:
          <article-title>Suffix arrays: a new method for on-line string searches</article-title>
          .
          <source>SIAM Journal on Computing</source>
          <volume>22</volume>
          (
          <issue>5</issue>
          )
          <fpage>935</fpage>
          {
          <fpage>948</fpage>
          (
          <year>1993</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>McCreight</surname>
            ,
            <given-names>E.M.:</given-names>
          </string-name>
          <article-title>A space-economical suffix tree construction algorithm</article-title>
          .
          <source>Journal of the ACM</source>
          <volume>23</volume>
          (
          <issue>2</issue>
          )
          <fpage>262</fpage>
          {
          <fpage>272</fpage>
          (
          <year>1976</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Nong</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          , Zhang,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Chan</surname>
          </string-name>
          ,
          <string-name>
            <surname>W.H.</surname>
          </string-name>
          :
          <article-title>Linear suffix array construction by almost pure induced-sorting</article-title>
          .
          <source>In: Data Compression Conference</source>
          .
          <volume>193</volume>
          {
          <issue>202</issue>
          (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Ukkonen</surname>
          </string-name>
          , E.:
          <article-title>On-line construction of suffix trees</article-title>
          .
          <source>Algorithmica</source>
          <volume>14</volume>
          (
          <issue>3</issue>
          )
          <fpage>249</fpage>
          {
          <fpage>260</fpage>
          (
          <year>1995</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Weiner</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Linear pattern matching algorithms</article-title>
          .
          <source>In: SWAT</source>
          .
          <volume>1</volume>
          {
          <issue>11</issue>
          (
          <year>1973</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>