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

Наша очСрСдная Π·Π°Π΄Π°Ρ‡Π° - 1930. Unique Length-3 Palindromic Subsequences.

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

Π”Π°Π½Π° строка s. НСобходимо ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ количСство ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠ² Π΄Π»ΠΈΠ½Ρ‹ 3, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ строки.

ΠŸΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ β€” это строка, получСнная ΠΈΠ· исходной строки ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, нуля) символов Π±Π΅Π· измСнСния ΠΈΡ… порядка. НапримСр, для строки "abcde" строка "ace" являСтся ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

ΠŸΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌ β€” это строка, которая читаСтся ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π² прямом ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ направлСниях.

πŸ’‘ ИдСя

Основная идСя Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌ Π΄Π»ΠΈΠ½Ρ‹ 3 опрСдСляСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ ΠΈ послСдними символами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΡŽΠ±Ρ‹ΠΌ допустимым символом посСрСдинС.
ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ эффСктивно ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Ρ‹ (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ послСдний символы) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ массива (bitset), Ρ‡Ρ‚ΠΎ позволяСт ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС памяти.

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

  1. ΠœΠ°ΡΡΠΈΠ²Ρ‹ частот:
    • prefix_frequency: Ρ…Ρ€Π°Π½ΠΈΡ‚ частоты символов слСва ΠΎΡ‚ рассматриваСмого.
    • suffix_frequency: Ρ…Ρ€Π°Π½ΠΈΡ‚ частоты символов справа ΠΎΡ‚ рассматриваСмого.
  2. Π‘ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ массив для встрСчСнных ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠ²:
    • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ массив u32, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ число, рассматриваСмоС ΠΊΠ°ΠΊ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ мноТСство, ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΡ‹ (ΠΏΠΎ сути, ΠΊΡ€Π°ΠΉΠ½ΠΈΠ΅ символы) для рассматриваСмого символа посСрСдинС.
  3. ΠžΠ±Ρ…ΠΎΠ΄ строки: Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа:
    • ОбновляСм массивы частот.
    • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΡ€Π°ΠΉΠ½ΠΈΠ΅ символы (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ prefix_frequency ΠΈ suffix_frequency) ΠΈ обновляСм Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ массив, Ссли символ допустим.
  4. ΠŸΠΎΠ΄ΡΡ‡Ρ‘Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠ²:
    • Π‘ΡƒΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ количСство установлСнных Π±ΠΈΡ‚ΠΎΠ² Π² массивС Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… массивов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ количСство ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠ².

⏱ Асимптотика

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

impl Solution {
    pub fn count_palindromic_subsequence(s: String) -> i32 {
        const ALPHABET_SIZE: usize = 26;

        // Step 1: Suffix frequency tracking
        let mut suffix_frequency = vec![0; ALPHABET_SIZE];
        for &c in s.as_bytes() {
            suffix_frequency[(c - b'a') as usize] += 1;
        }

        let mut prefix_frequency = vec![0; ALPHABET_SIZE];
        let mut seen_palindromes = vec![0u32; ALPHABET_SIZE]; // Bitset for each character pair

        // Step 2: Traverse characters
        for &c in s.as_bytes() {
            let index = (c - b'a') as usize;
            suffix_frequency[index] -= 1;

            let mut val = seen_palindromes[index];
            for i in 0..ALPHABET_SIZE {
                let mask = 1 << i;
                // Check if the bit is unset and the pair forms a valid palindrome
                if (val & mask) == 0 && prefix_frequency[i] > 0 && suffix_frequency[i] > 0 {
                    val |= mask; // Set the bit for the pair (index, i)
                }
            }
            seen_palindromes[index] = val;

            prefix_frequency[index] += 1;
        }

        // Step 3: Count unique palindromes
        seen_palindromes.iter().map(|&bits| bits.count_ones() as i32).sum()
    }
}