use std::collections::HashMap;
use libsais::{
SuffixArrayConstruction,
suffix_array::{AlphabetSize, ExtraSpace},
};
const TEXT_LEN: usize = 10;
fn create_random_text() -> Vec<i64> {
std::iter::repeat_with(rand::random)
.filter(|&x| x >= 0)
.take(TEXT_LEN)
.collect()
}
fn with_dense_alphabet(text: &[i64]) -> (Vec<i64>, usize) {
let mut transformation_table: HashMap<_, _> = text.iter().map(|&c| (c, 0i64)).collect();
let mut unique_characters: Vec<_> = transformation_table.keys().copied().collect();
let alphabet_size = unique_characters.len();
unique_characters.sort_unstable();
for (i, c) in unique_characters.iter().enumerate() {
*transformation_table.get_mut(c).unwrap() = i as i64;
}
unique_characters.resize(text.len(), 0);
let mut dense_text = unique_characters;
for (dense_c, original_c) in dense_text.iter_mut().zip(text) {
*dense_c = transformation_table[original_c];
}
(dense_text, alphabet_size)
}
fn main() {
let initial_text = create_random_text();
println!("Initial text: {initial_text:?}");
let (mut dense_text, alphabet_size) = with_dense_alphabet(&initial_text);
println!("Dense text: {dense_text:?}\nAlphabet size: {alphabet_size}");
let mut construction = SuffixArrayConstruction::for_text_mut(&mut dense_text)
.in_owned_buffer64()
.single_threaded();
construction = construction.with_extra_space_in_buffer(ExtraSpace::None);
unsafe {
construction = construction.with_alphabet_size(AlphabetSize::new(alphabet_size as i64));
}
let res = construction.run().unwrap();
println!("Suffix array: {:?}", res.suffix_array());
}