///|
/// Suffix Array and Suffix Tree Demo
fn main {
println("=== Suffix Array and Suffix Tree Demo ===")
println("\n1. Suffix Array - Basic Operations:")
println("===================================")
let sa = @src.SuffixArray::new("banana")
println("Text: " + sa.text())
println("Suffix array length: " + sa.len().to_string())
println("\nSorted suffixes:")
for i = 0; i < sa.len(); i = i + 1 {
println(" [" + i.to_string() + "] " + sa.get_sorted_suffix(i))
}
println("\n2. Suffix Array - Pattern Matching:")
println("===================================")
println("Count of 'ana': " + sa.count("ana").to_string())
println("Count of 'an': " + sa.count("an").to_string())
println("Count of 'b': " + sa.count("b").to_string())
println("Count of 'xyz': " + sa.count("xyz").to_string())
let pos = sa.locate("ana")
let pos_str = if pos.length() == 0 {
"none"
} else {
let buf = StringBuilder()
for i = 0; i < pos.length(); i = i + 1 {
if i > 0 {
buf.write_string(", ")
}
buf.write_string(pos[i].to_string())
}
buf.to_string()
}
println("Positions of 'ana': " + pos_str)
println("\n3. LCP Array (Longest Common Prefix):")
println("=====================================")
let lcp = @src.LCPArray::new(sa)
println("LCP values:")
let lcp_values = lcp.lcp()
for i = 0; i < lcp_values.length(); i = i + 1 {
println(" [" + i.to_string() + "] " + lcp_values[i].to_string())
}
println("Max LCP: " + lcp.max_lcp().to_string())
println("\n4. Suffix Tree - Basic Operations:")
println("===================================")
let st = @src.SuffixTree::new("banana")
println("Text: " + st.text())
println("Tree size (nodes): " + st.size().to_string())
println("Contains 'ana': " + st.contains("ana").to_string())
println("Contains 'ban': " + st.contains("ban").to_string())
println("Contains 'xyz': " + st.contains("xyz").to_string())
println("\n5. Suffix Tree - Pattern Matching:")
println("==================================")
println("Count of 'ana': " + st.count("ana").to_string())
println("Count of 'an': " + st.count("an").to_string())
let st_pos = st.locate("ana")
let st_pos_str = if st_pos.length() == 0 {
"none"
} else {
let buf = StringBuilder()
for i = 0; i < st_pos.length(); i = i + 1 {
if i > 0 {
buf.write_string(", ")
}
buf.write_string(st_pos[i].to_string())
}
buf.to_string()
}
println("Positions of 'ana': " + st_pos_str)
println("\n6. Suffix Tree - Longest Repeated Substring:")
println("=============================================")
println("LRS of 'banana': " + st.longest_repeated_substring())
let st_dna = @src.SuffixTree::new("ACGTACGT")
println("LRS of 'ACGTACGT': " + st_dna.longest_repeated_substring())
println("\n7. DNA Sequence Example:")
println("=========================")
let dna_sa = @src.SuffixArray::new("ACGTACGT")
let dna_st = @src.SuffixTree::new("ACGTACGT")
println("Text: ACGTACGT")
println("SA count of 'ACGT': " + dna_sa.count("ACGT").to_string())
println("ST count of 'ACGT': " + dna_st.count("ACGT").to_string())
let dna_pos = dna_sa.locate("ACGT")
let dna_pos_str = if dna_pos.length() == 0 {
"none"
} else {
let buf = StringBuilder()
for i = 0; i < dna_pos.length(); i = i + 1 {
if i > 0 {
buf.write_string(", ")
}
buf.write_string(dna_pos[i].to_string())
}
buf.to_string()
}
println("SA positions of 'ACGT': " + dna_pos_str)
println("\n8. Suffix Tree Structure Output:")
println("================================")
let st_abc = @src.SuffixTree::new("abc")
println(st_abc.to_string())
println("\n=== Demo Complete ===")
}