Pagini recente » Cod sursa (job #168276) | Cod sursa (job #3183289) | Cod sursa (job #1632208) | Cod sursa (job #1053135) | Cod sursa (job #2404524)
#include <bits/stdc++.h>
using namespace std;
const int LOGMAX = 16;
const int MAXLEN = 16390;
char crStr[MAXLEN] ;
int len , minRep , crLog ;
struct Sir{
int val[2];
int ord ;
};
int dpOrd[LOGMAX][MAXLEN], v [MAXLEN] ;
Sir allSir [MAXLEN];
bool cmp(Sir a , Sir b){
if (a.val[ 0 ] == b.val[ 0 ]) {
return a.val [ 1 ] < b.val[ 1 ];
}
return a.val [ 0 ] < b.val [ 0 ];
}
void preCalcDp(){
for (int i = 1 ; i <= len ; i++)
dpOrd [ 0 ][ i ] = crStr [ i ] - 'a';
for (crLog = 1 ; (1<<(crLog-1)) <= len ; crLog++){
for ( int i = 1 ; i <= len ; i++ ){
allSir [i].ord = i;
allSir [i].val[0] = dpOrd [crLog - 1] [i];
if ( i + (1<<(crLog-1) ) <= len )
allSir [i].val [1] = dpOrd [crLog - 1] [i + (1<<(crLog-1) )];
else
allSir [i].val [1] = -1;
}
sort (allSir + 1 , allSir + len + 1 , cmp);
dpOrd [crLog] [allSir [1].ord] = 1;
for (int i = 2 ; i <= len ; i++){
dpOrd [crLog][allSir[i].ord] = dpOrd[crLog][allSir[i - 1].ord];
if ( allSir[i].val[0] != allSir [i - 1].val[0] || allSir [i].val [1] != allSir [i - 1].val[1])
dpOrd [crLog][ allSir[i].ord]++;
}
}
crLog --;
for(int i = 1 ; i < len ; i++)
v[dpOrd[crLog][i]] = i;
}
int LongestCPRefix (int x , int y){
int sol = 0;
if (x == y)
return len;
for (int i = crLog ; i >= 0 ; i--){
if(dpOrd [ i ][ x ] == dpOrd [i][y]){
sol += (1<<i);
x += (1<<i);
y += (1<<i);
if (x > len || y > len)
return sol;
}
}
return sol;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d", &len , &minRep);
cin >> (crStr + 1) ;
preCalcDp();
int sol = 0;
for (int i = 1 ; i < len - minRep + 1 ; i++)
sol = max(sol , LongestCPRefix(v[i] , v [i + minRep - 1]));
printf("%d", sol);
return 0;
}