главная Π½ΠΎΠ²ΠΎΠ΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ

Бсылка Π½Π° Π·Π°Π΄Π°Ρ‡Ρƒ β€” 1415. The k-th Lexicographical String of All Happy Strings of Length n.

πŸ“ ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ

"Бчастливая строка" – это строка Π΄Π»ΠΈΠ½Ρ‹ n, состоящая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· символов ['a', 'b', 'c'], Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ Π΄Π²ΡƒΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… подряд ΠΈΠ΄ΡƒΡ‰ΠΈΡ… символов.
НуТно Π½Π°ΠΉΡ‚ΠΈ k-ю ΡΡ‡Π°ΡΡ‚Π»ΠΈΠ²ΡƒΡŽ строку Π² лСксикографичСском порядкС, Π»ΠΈΠ±ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ "", Ссли Ρ‚Π°ΠΊΠΈΡ… строк мСньшС k.

πŸ’‘ ИдСя

Рассмотрим связь счастливых строк с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ строками.
КаТдая счастливая строка:

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС k-1 ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ опрСдСляСт структуру Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ строки (Π±Π΅Π· ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа).
ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΡ‚Ρ‹ 0 ΠΈ 1 ΠΈΠ· этого Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя допустимыми символами ΠΏΡ€ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ символа ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ счастливой строки. πŸš€

πŸ” Π”Π΅Ρ‚Π°Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°

  1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ количСство Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… строк с фиксированным ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ символом:
    • happy_count = 2nβˆ’1
    • Π­Ρ‚ΠΎ число ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сколько строк начинаСтся с 'a', 'b' ΠΈΠ»ΠΈ 'c'.
  2. Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (k-1) / happy_count:
    • (k-1) / happy_count = 0 β†’ 'a'
    • (k-1) / happy_count = 1 β†’ 'b'
    • (k-1) / happy_count = 2 β†’ 'c'
  3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΠΈΠ· Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ k-1 для Π²Ρ‹Π±ΠΎΡ€Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… символов:
    ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ (0 ΠΈΠ»ΠΈ 1) управляСт Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ символами, ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ.
    • Если Π±ΠΈΡ‚ = 0, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ мСньший допустимый символ.
    • Если Π±ΠΈΡ‚ = 1, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ больший допустимый символ.
  4. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΡƒΡŽ строку. πŸš€

πŸ“ˆ Асимптотика

πŸ’» Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

impl Solution {
    pub fn get_happy_string(n: i32, k: i32) -> String {
        let mut result = String::with_capacity(n as usize);
        let mut k = k - 1; // Convert to zero-based index
        let happy_count = 1 << (n - 1); // Number of happy strings with a fixed first character

        // Determine the first character
        let first_char = match k / happy_count {
            0 => 'a',
            1 => 'b',
            2 => 'c',
            _ => return "".to_string(), // Not enough happy strings exist
        };
        result.push(first_char);
        k %= happy_count; // Update k to determine the remaining characters

        // Construct the happy string
        for i in (0..n - 1).rev() {
            let prev_char = result.chars().last().unwrap();
            let happy_count = 1 << i; // Number of happy strings with a fixed prefix of length n-i

            let mut next_char = Self::adjust_char('a', prev_char);
            if k >= happy_count {
                next_char = Self::adjust_char(((next_char as u8) + 1) as char, prev_char);
                k -= happy_count;
            }
            result.push(next_char);
        }

        result
    }

    // Ensure that the selected character is different from the previous one
    fn adjust_char(candidate: char, prev_char: char) -> char {
        if candidate == prev_char {
            return ((candidate as u8) + 1) as char; // Move to the next valid character
        }
        candidate
    }
}

Tags: #rust #algorithms #strings