Sirius 2022
June 13, 2022
Z-функция, Префикс-Функция, Бор, Манакер
Z-функция
Z-функция - это длина максимального префикса подстроки S, который начинается в x, который одновременно является префиксом нашей строки S
s[x ... x + k] == s[0 ... k]
int n; str s; vector<int> z(n); int l = 0, r = 0; for(int i = 1; i < n; i++){ if(i <= r){ z[i] = min(z[i - l], r - i + 1); } while(z[i] + i < n && s[z[i]] == s[z[i] + i]){ z[i]++; } if(z[i] + i - 1 > r){ l = i; r = z[i] + i - 1; } }
Префикс Функция
Префикс функцией от строки S называется такой массив p, где Pi - это длина наибольшего префикса длинны S, который также является суффиксом i-того префикса (не считая весь i-й префикс)
Например, для строки "aataataa" префикс функция будет равна [0,1,0,1,2,3,4,5]
int n; str s; vector<int> p(n); for(int i = 1; i < n; i++){ int tmp = p[i - 1] while(s[i] != s[tmp] && tmp){ tmp = s[tmp - 1] } if(s[i] == s[tmp]){ p[i] = tmp + 1; } }
Манакер
Пусть у нас есть строка S и мы хотим в ней найти все подпалиндромы
https://ru.algorithmica.org/cs/string-searching/manacher/ - тут