Algoritmul Kasai este destul de uor i lucreaz n O ( n) .
S ne uitm la cele dou sufixe continue n matrice de sufixe .
S indexurile lor n sufix matrice fi i1 i i1 + 1. Dac LCP lor > 0 , atunci dac am terge prima scrisoare de la amndoi. Putem vedea cu uurin c noile siruri de caractere va avea aceeai ordine relativ . De asemenea, se poate observa c LCP de noi siruri de caractere va fi exact LCP - 1 . S ne acum uita-te la CARE ir avem de la sufixul i prin eliminarea primul su caracter . Evident, aceasta este o parte sufix al irului de asemenea . S indicele su s fie i2 . S ne uitm la LCP de sufixe i2 i i2 + 1. Se poate vedea c este LCP va fi LCP cel puin deja menionat - 1. Acest lucru este asociat cu anumite proprieti ale LCP matrice , n special , c LCP ( i, j) = min ( lcpi , lcpi + 1 , ... , lcpj - 1 ) . i, n cele din urm s facem algoritmul bazat pe mai sus . Vom avea nevoie de un rang suplimentar tablou [ n ] , situate va conine indicele n matrice de sufixe a sufixului de pornire n indexul i . n primul rnd ar trebui s calculeze LCP a sufixului cu rang index [ 0 ] . Atunci s repeta prin toate sufixele n ordine n care le ndeplinesc n ir i se calculeaz LCP [ rang [ i] ] n mod naiv , dar pornind de la IMA [ rang [ i - 1 ] ] - 1. Usor vedea c acum avem O ( n) algoritmul pentru c pefiecare pas LCP nostru descresctoare nu mai mult de la 1 ( cu excepia cazului cnd rang [ i ] = n - 1 ) . Implementation: vector<int> kasai(string s, vector<int> sa) { int n=s.size(),k=0; vector<int> lcp(n,0); vector<int> rank(n,0);