<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">KMP Based Pattern Matching Algorithms for Multi-Track Strings</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Yohei</forename><surname>Diptarama</surname></persName>
							<email>diptarama@shino.</email>
							<affiliation key="aff0">
								<orgName type="department">Graduate School of Information Sciences</orgName>
								<orgName type="institution">Tohoku University</orgName>
								<address>
									<country key="JP">Japan</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Kazuyuki</forename><surname>Ueki</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">Graduate School of Information Sciences</orgName>
								<orgName type="institution">Tohoku University</orgName>
								<address>
									<country key="JP">Japan</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Ayumi</forename><surname>Narisawa</surname></persName>
							<email>narisawa@</email>
							<affiliation key="aff0">
								<orgName type="department">Graduate School of Information Sciences</orgName>
								<orgName type="institution">Tohoku University</orgName>
								<address>
									<country key="JP">Japan</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><surname>Shinohara</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">Graduate School of Information Sciences</orgName>
								<orgName type="institution">Tohoku University</orgName>
								<address>
									<country key="JP">Japan</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">KMP Based Pattern Matching Algorithms for Multi-Track Strings</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">648B78AD6469F9B9F4EFA0760D0D3382</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T01:42+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>string matching</term>
					<term>multi-track</term>
					<term>KMP algorithm</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><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 find 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 first algorithm is an exact matching algorithm that runs in O(nN ) time after O(mM )-time preprocessing. The second and third algorithms are filtering 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></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>Pattern matching problem on strings is defined as finding all occurences of a pattern string in a text string. Many of pattern matching algorithms can find occurences of the pattern fast by preprocessing the pattern such as AC automaton <ref type="bibr" target="#b0">[1]</ref>, and KMP algorithm <ref type="bibr" target="#b6">[7]</ref>, or by constructing data structure from the text such as suffix tree <ref type="bibr" target="#b12">[13]</ref>, suffix array <ref type="bibr" target="#b8">[9]</ref>, and position heap <ref type="bibr" target="#b1">[2]</ref>.</p><p>Katsura et al. <ref type="bibr" target="#b4">[5,</ref><ref type="bibr" target="#b5">6]</ref> defined 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 <ref type="bibr" target="#b4">[5]</ref>, multi-track position heap <ref type="bibr" target="#b5">[6]</ref>, or by preprocessing the the pattern such as AC automaton based algorithm <ref type="bibr" target="#b4">[5]</ref>.</p><p>In this paper, we propose three new algorithms for multi-track pattern matching problem, based on KMP algorithm <ref type="bibr" target="#b6">[7]</ref> 1 . The first one is a full-permuted pattern matching algorithm, that we call it MTKMP for short. Second and third are filtering 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 <ref type="bibr" target="#b4">[5]</ref> that constructs 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 filtering, 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 <ref type="bibr" target="#b4">[5]</ref> 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.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Preliminaries</head><p>Let w ∈ Σ n be a string of length n over an alphabet Σ, and σ = |Σ| be the alphabet size. |w| 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</p><formula xml:id="formula_0">[i : j] for 1 ≤ i ≤ j ≤ |w|. In addition, w[: i] = w[1 : i] and w[i :] = w[i : |w|]</formula><p>denotes a prefix 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 = (w 1 , w 2 , ..., w N ) is an N -tuple of strings w i ∈ Σ n , and each w i is called the i-th track of W. The length n of a multi-track is denoted by |W| len . The number N of tracks in a multi-track is called track count and denoted by |W| num . For two multi-tracks X = (x 1 , x 2 , .., x N ) and Y = (y 1 , y 2 , .., y N ), we write Let r = (r 1 , r 2 , . . . , r M ) be a partial permutation of (1, 2, . . . , N ) for M ≤ N . For a multi-track W = (w 1 , w 2 , . . . , w N ), a permuted multi-track of W is denoted by either W⟨r 1 , r 2 , . . . , r M ⟩ or W⟨r⟩. Sorted index of a multi track SI(W) = (r 1 , r 2 , . . . , r N ) is defined as a permutation such that w ri ≼ w rj for any 1 ≤ i ≤ j ≤ N . For two multi-tracks X = (x 1 , x 2 , . . . , x M ) and Y = (y 1 , y 2 , . . . , y N ), X permuted-matches Y, denoted by X ◃▹ ⊑ Y, if ∃r.X = Y⟨r⟩, and X full-permutedmatches Y, denoted by X ◃▹ = Y, if M = N and ∃r.X = Y⟨r⟩. Throughout the paper, we assume that P is a pattern with |P| num = M and |P| len = m, and T is a text with |T| num = N and |T| len = n. The pattern matching problem on multi-tracks are defined as follows.</p><formula xml:id="formula_1">X = Y if x i = y i for 1 ≤ i ≤ N . W[i] denotes (w 1 [i], w 2 [i], ...w N [i]),</formula><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><formula xml:id="formula_2">P ◃▹ ⊑ T[i : i + m − 1].</formula><p>Moreover, we call it full-permuted pattern matching if M = N , and sub-permuted pattern matching if M &lt; N .</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Algorithm 1: MTKMP pattern matching algorithm</head><formula xml:id="formula_3">Input: Multi-track T, Multi-track P Output: match positions compute SI (T[i :]) for 1 ≤ i ≤ n and SI (P[i :]) for 1 ≤ i ≤ m; 1 constructFailureFunction(); 2 i = 1; j = 1; 3 while i ≤ n do 4 while j &gt; 0 and T[i]⟨SI (T[i − j + 1 :])⟩ ̸ = P[j]⟨SI (P[1 :])⟩ do j = F [j]; 5 i = i + 1; j = j + 1; 6 if j &gt; m then 7 output (i − j + 1); 8 j = F [j]; 9 Function constructFailureFunction() 10 i = 1; j = 1; F [1] = 0; 11 while i ≤ m do 12 while j &gt; 0 and P[j]⟨SI (P[1 :])⟩ ̸ = P[i]⟨SI (T[i − j + 1 :])⟩ do j = F [j]; 13 i = i + 1; j = j + 1; 14 F [i] = j; 15</formula><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 defined as the length of the longest proper suffix of P[1 : i − 1] that permuted-matches with a prefix of P, except F [1] = 0 and F [2] = 1. In order to construct the failure function, first MTKMP finds the value of sorted index SI (P[i : m]) for all 1 ≤ i ≤ m. Then permuted-matching of suffix P[j : i] and prefix 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 <ref type="bibr" target="#b2">[3,</ref><ref type="bibr" target="#b9">10,</ref><ref type="bibr" target="#b11">12,</ref><ref type="bibr" target="#b12">13]</ref> or suffix array <ref type="bibr" target="#b3">[4,</ref><ref type="bibr" target="#b7">8,</ref><ref type="bibr" target="#b8">9,</ref><ref type="bibr" target="#b10">11]</ref>. 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  </p><formula xml:id="formula_4">5 i = i + 1; j = j + 1; 6 if j &gt; m then 7 if T[i − j + 1 : i − 1] ◃ ▹ ⊑ P then output (i − j + 1); 8 j = F [j]; 9 Function constructFailureFunction() 10 i = 1; j = 1; F [1] = 0; 11 while i ≤ m do 12 while j &gt; 0 and P ′ [i] ̸ = P ′ [j] do j = F [j]; 13 i = i + 1; j = j + 1; 14 if i ≤ m and P ′ [i] = P ′ [j] then F [j] = F [i]; else F [j] = i;</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">KMP Algorithm for Filtering on Multi-Track String</head><p>In this section we propose two filtering 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 find 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 first 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.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1">Full-Permuted Pattern Matching Algorithm</head><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></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Definition 1. For</head><formula xml:id="formula_5">Z = (z 1 , z 2 , . . . , z N ), sort(Z) = Z ′ = (z ′ 1 , z ′ 2 , . . . , z ′ N ) such that ∃r.Z ′ [i] = Z[i]⟨r⟩ and z ′ j [i] ≼ z ′ j+1 [i] for 1 ≤ i ≤ |Z| len and 1 ≤ j &lt; N . Definition 2. For Z = (z 1 , z 2 , . . . , z N ), bucket(Z) = (b 1 , b 2 , . . . , b σ ) such that b j [i] is the number of the lexicographical j-th character in Z[i].</formula><p>For example, for a multi-track Z = (abab, bbac, aabb, cabb, abba), the sort(Z) and bucket(Z) are defined as follows,</p><formula xml:id="formula_6">Z =       a b a b b b a c a a b b c a b b a b b a       , sort(Z) =       a a a a a a a b a b b b b b b b c b b c       , bucket(Z) =   3 2 2 1 1 3 3 3 1 0 0 1   .</formula><p>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 filtering 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.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2">Permuted Pattern Matching Algorithm</head><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,  </p><formula xml:id="formula_7">Y ) = ∑ σ i=1 max(0, Y [i] − X[i]) for two</formula><formula xml:id="formula_8">13 i = i + 1; j = j + 1; 14 if i ≤ m and P ′ [i] = P ′ [j] then F [j] = F [i]; else F [j] = i; 15 Function diff (Vector X, Vector Y ) 16 Int sum = 0; 17 for k = 1 to |X| do 18 sum = sum + max(0, Y [k] − X[k]);</formula></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Experiments</head><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 <ref type="bibr" target="#b4">[5]</ref>.</p><p>In the first 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 <ref type="figure" target="#fig_5">1 (a)-(d)</ref> 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 filtering algorithms need lots of time to verify them.   track count of the text and track count of the pattern is small, also when the alphabet size is large.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Conclusion</head><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></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head></head><label></label><figDesc>and W[i : j] denotes (w 1 [i : j], w 2 [i : j], . . . , w N [i : j]) for 1 ≤ i ≤ j ≤ |W| len . Moreover, the prefix and suffix of W are denoted by W[: i] = W[1 : i] and W[i :] = W[i : |W| len ], respectively.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Algorithm 2 : 1 constructFailureFunction(); 2 i 3 while i ≤ n do 4 while</head><label>21234</label><figDesc>Filter-MTKMP-Full pattern matching algorithmInput: Multi-track T, Multi-track P Output: match position T ′ = func(T); P ′ = func(P); = 1, j = 1; j &gt; 0 and T ′ [i] ̸ = P ′ [j] do j = F [j];</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>15a</head><label></label><figDesc>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.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Algorithm 3 : 1 constructFailureFunction(); 2 i 3 while i ≤ n do 4 while 5 i 6 if j &gt; m then 7 if 8 j 9 Function constructFailureFunction() 10 i</head><label>312345678910</label><figDesc>integer vectors X and Y . Then, it finds candidates of matched position by using the failure function.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 + Filter-MTKMP pattern matching algorithm Input: Multi-track T, Multi-track P Output: match position T ′ = bucket(T); P ′ = bucket(P); = 1; j = 1; j &gt; 0 and diff (P′ [j], T ′ [i]) &gt; 0 do j = F [j]; = i + 1; j = j + 1; T[i − j + 1 : i − 1] ◃ ▹ ⊑ P then output (i − j + 1); = F [j]; = 1; j = 1; F [1] = 0;11 while i ≤ m do 12 while j &gt; 0 and diff (P ′ [i], P ′ [j]) &gt; N − M do j = F [j];</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head></head><label></label><figDesc>time for finding candidates, and O(cmM ) time for checking the candidates, where c is the number of candidates.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Fig. 1 .</head><label>1</label><figDesc>Fig. 1. Running time of the algorithms on full-permuted pattern matching with respect to (a) text length, (b) track count, (c) pattern length, and (d) alphabet size.</figDesc><graphic coords="7,137.59,115.87,340.10,224.69" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Figure 2 (</head><label>2</label><figDesc>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</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head>Fig. 2 .</head><label>2</label><figDesc>Fig. 2. Running time of the algorithms on sub-permuted pattern matching with respect to (a) pattern track and (b) alphabet size.</figDesc><graphic coords="7,136.05,508.36,340.11,116.22" type="bitmap" /></figure>
		</body>
		<back>

			<div type="acknowledgement">
<div xmlns="http://www.tei-c.org/ns/1.0"><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></div>
			</div>

			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<analytic>
		<title level="a" type="main">Efficient string matching: an aid to bibliographic search</title>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">V</forename><surname>Aho</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">J</forename><surname>Corasick</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Communications of the ACM</title>
		<imprint>
			<biblScope unit="volume">18</biblScope>
			<biblScope unit="issue">6</biblScope>
			<biblScope unit="page" from="333" to="340" />
			<date type="published" when="1975">1975</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Position heaps: A simple and dynamic text indexing data structure</title>
		<author>
			<persName><forename type="first">A</forename><surname>Ehrenfeucht</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><forename type="middle">M</forename><surname>Mcconnell</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Osheim</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><forename type="middle">W</forename><surname>Woo</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Journal of Discrete Algorithms</title>
		<imprint>
			<biblScope unit="volume">9</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="100" to="121" />
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">Optimal suffix tree construction with large alphabets</title>
		<author>
			<persName><forename type="first">M</forename><surname>Farach</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">FOCS</title>
		<imprint>
			<biblScope unit="page" from="137" to="143" />
			<date type="published" when="1997">1997</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Simple linear work suffix array construction</title>
		<author>
			<persName><forename type="first">J</forename><surname>Kärkkäinen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Sanders</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">ICALP</title>
		<imprint>
			<biblScope unit="page" from="943" to="955" />
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">Permuted pattern matching on multi-track strings</title>
		<author>
			<persName><forename type="first">T</forename><surname>Katsura</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Narisawa</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Shinohara</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Bannai</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Inenaga</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">SOFSEM</title>
		<imprint>
			<biblScope unit="page" from="280" to="291" />
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Position heaps for permuted pattern matching on multi-track strings</title>
		<author>
			<persName><forename type="first">T</forename><surname>Katsura</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Otomo</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Narisawa</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Shinohara</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of Student Research Forum Papers and Posters at SOFSEM</title>
				<meeting>Student Research Forum Papers and Posters at SOFSEM</meeting>
		<imprint>
			<date type="published" when="2015">2015. 2015</date>
			<biblScope unit="page" from="41" to="531" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Fast pattern matching in strings</title>
		<author>
			<persName><forename type="first">D</forename><forename type="middle">E</forename><surname>Knuth</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">H M</forename><surname>Jr</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><forename type="middle">R</forename><surname>Pratt</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">SIAM Journal on Computing</title>
		<imprint>
			<biblScope unit="volume">6</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="323" to="350" />
			<date type="published" when="1977">1977</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Space efficient linear time construction of suffix arrays</title>
		<author>
			<persName><forename type="first">P</forename><surname>Ko</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Aluru</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">CPM</title>
		<imprint>
			<biblScope unit="page" from="200" to="210" />
			<date type="published" when="2003">2003</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">Suffix arrays: a new method for on-line string searches</title>
		<author>
			<persName><forename type="first">U</forename><surname>Manber</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Myers</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">SIAM Journal on Computing</title>
		<imprint>
			<biblScope unit="volume">22</biblScope>
			<biblScope unit="issue">5</biblScope>
			<biblScope unit="page" from="935" to="948" />
			<date type="published" when="1993">1993</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">A space-economical suffix tree construction algorithm</title>
		<author>
			<persName><forename type="first">E</forename><forename type="middle">M</forename><surname>Mccreight</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Journal of the ACM</title>
		<imprint>
			<biblScope unit="volume">23</biblScope>
			<biblScope unit="issue">2</biblScope>
			<biblScope unit="page" from="262" to="272" />
			<date type="published" when="1976">1976</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">Linear suffix array construction by almost pure induced-sorting</title>
		<author>
			<persName><forename type="first">G</forename><surname>Nong</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Zhang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><forename type="middle">H</forename><surname>Chan</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Data Compression Conference</title>
				<imprint>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="193" to="202" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<analytic>
		<title level="a" type="main">On-line construction of suffix trees</title>
		<author>
			<persName><forename type="first">E</forename><surname>Ukkonen</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Algorithmica</title>
		<imprint>
			<biblScope unit="volume">14</biblScope>
			<biblScope unit="issue">3</biblScope>
			<biblScope unit="page" from="249" to="260" />
			<date type="published" when="1995">1995</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Linear pattern matching algorithms</title>
		<author>
			<persName><forename type="first">P</forename><surname>Weiner</surname></persName>
		</author>
		<idno>1-11</idno>
	</analytic>
	<monogr>
		<title level="j">SWAT</title>
		<imprint>
			<date type="published" when="1973">1973</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
