Суффикстик структуралар

Суффикстик массив: саптын бардык суффикстерин иреттөө жана анын эмне берери.

Суффикстик массив — саптын бардык суффикстеринин иреттелген тизмеси (албетте, алардын баштапкы позициялары гана сакталат). Ал маселелердин бүтүндөй классын ачат: каалаган үлгүнү 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). Сабакты өттүм деп белгилеңиз.
Доска