Sunteți pe pagina 1din 2

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);

for(int i=0; i<n; i++) rank[sa[i]]=i;

for(int i=0; i<n; i++, k?k--:0)

{
if(rank[i]==n-1) {k=0; continue;}
int j=sa[rank[i]+1];
while(i+k<n && j+k<n && s[i+k]==s[j+k]) k++;
lcp[rank[i]]=k;
}
return lcp;
}

S-ar putea să vă placă și