Santa Claus — 2022-10-25 01:15 (72 days ago) — edit — reply
1. **Špatný vstup pro naivní algoritmus** Nechť $s = a^n$ a $j = a^mc$ Pak algoritmus poběží $(S-J)J = SJ-J^2 \in \Theta(SJ)$ 2. **Nejdelší vlastní prefix** Projdeme slovo od začátku a zároveň od konce, končíme při neshodě znaků. Protože se musí jednat o vlastní prefix, nemůžeme vrátit délku celého slova, takže v případě palidromu snížíme délku o jednotku. Prakticky můžeme k řetězci $\alpha$ sestrojit obrácený řetězec $\alpha_{rev}$. Z obou řetězců odstraníme poslední znak a pak vracíme délku shodných prefixů obou řetězců. Řetězec takto projdeme dvakrát, algoritmus je lineární. Pamětově je konstantní, protože až na vstup nic neukládáme. 3. **Příliš jehel** Uvažme seno $s = a^n$ kde BÚNO $n = 2^i, i \in \mathbb{N}$. K němu uvažme jehly $\iota = \{ a, a^2, a^4, a^8, ..., a^n \}$ Celková délka sena je $n$. Součet délek jehel $J = 1 + 2 + 4 + ... + n = 2n - 1 \in \Theta(n)$ Ale celkový počet výskytů bude $n + (n-1) + (n-3) + (n-7) + ... + 1 = n \log(n) - const \cdot n$ 4. **Počty výskytů jehel** Použijeme AC algoritmus, ale nebudeme procházet zkratkové hrany. Místo toho si v každém stavu automatu uložíme, kolikrát jsme se v něm zastavili. Na konci projdeme celý strom automatu a vždy projdeme všechny zkratkové hrany, součty takto sečteme pro každou jehlu. Pak už zbývá jenom strom projít podruhé a pro každý vrchol s jehlou ohlásit počet výskytů. Tyto průchody jsou lineární s počtem jehel, každá zkratková hrana odpovídá jehle.