Суффикстик структуралар
Суффикстик массив: саптын бардык суффикстерин иреттөө жана анын эмне берери.
Суффикстик массив — саптын бардык суффикстеринин иреттелген тизмеси (албетте, алардын баштапкы позициялары гана сакталат). Ал маселелердин бүтүндөй классын ачат: каалаган үлгүнү O(m log n) убакытта издөө, ар түрдүү сапчалардын саны, эки саптын эң узун жалпы сапчасы.
«Түз» иреттөө менен куруу — O(n² log n): суффикстерди салыштыруу узак. Классикалык амал — экинин даражалары боюнча иреттөө: суффикстерди адегенде биринчи 1, анан 2, 4, 8... символу боюнча иреттейбиз. Ар бир кадамда суффикс мурунку кадамдагы эквиваленттик класстардын ТҮГӨЙҮ менен сүрөттөлөт — түгөйдү салыштыруу O(1).
O(n log² n) убакыттагы суффикстик массив. Киргизиңиз: banana
banana үчүн суффикстердин тартиби: a, ana, anana, banana, na, nana.
Амалдардын талдоосу:
• терминалдык $ символу (бардык тамгалардан кичине) суффикстерди «циклдик жылыштарга» теңейт — ошондуктан (i + len) % n иштейт;
• эквиваленттик класс — «узундугу len болгон бирдей префикстердин тобунун номери»; (баштын классы, ортонун классы) түгөйү узундугу 2·len болгон префиксти толук сүрөттөйт;
• std::sort ордуна саноо иреттөөсү менен классикалык O(n log n) чыгат.
Теманын кийинки кадамы — LCP массиви (кошуна суффикстердин жалпы префикстеринин узундуктары, O(n) убакыттагы Касаи алгоритми): аны менен, мисалы, ар түрдүү сапчалардын саны эсептелет. Андан да күчтүүсү — суффикстик автомат, бирок ал массивди ишенимдүү өздөштүргөндөн кийин күтөт.
Тапшырма: banana суффикстик массивинин жардамы менен ар түрдүү сапчалардын санын кол менен эсептеңиз (суффикстердин узундуктарынын суммасы минус LCP суммасы; жооп: 15).
Сабакты өттүм деп белгилеңиз.