Pagini recente » Cod sursa (job #1327873) | Cod sursa (job #2280174) | Cod sursa (job #1894596) | Cod sursa (job #361410) | Cod sursa (job #2346299)
#include <fstream>
#include <cstring>
#include <algorithm>
#define v1 first.first
#define v2 first.second
#define poz second
using namespace std;
const int DIM=16400;
char s[DIM];
int n;
int p[18][DIM],val[DIM];
int e,len;
pair< pair<int, int>, int > L[DIM];
int lcp(int i, int j) {
int f = e;
int len = (1<<e);
int sol = 0;
while (len) {
if (p[f][i] == p[f][j]) {
sol += len;
i+=len;
j+=len;
}
f--;
len/=2;
}
return sol;
}
int main () {
ifstream fin ("substr.in");
ofstream fout("substr.out");
int k;
fin>>n>>k;
fin>>s;
//n = strlen(s);
for (int i=0;i<n;i++)
p[0][i] = s[i]-'a';
for (e=0, len=1;len<=n;e++, len*=2) {
/// am sortat dupa len = 2^e
/// caut sa sortez dupa 2*len = 2^(e+1)
for (int i=0;i<n;i++) {
L[i].v1 = p[e][i];
if (i+len < n)
L[i].v2 = p[e][i+len];
else
L[i].v2 = -1;
L[i].poz = i;
}
sort(L, L+n);
p[ e+1 ][ L[0].poz ] = 0;
for (int i=1;i<n;i++)
if (L[i].first == L[i-1].first)
p[ e+1 ][ L[i].poz ] = p[ e+1 ][ L[i-1].poz ];
else
p[ e+1 ][ L[i].poz ] = 1 + p[ e+1 ][ L[i-1].poz ];
}
/// linia e este rezultal final
for(int i=0;i<n;i++)
//fout<<p[e][i]<<' ';
val[p[e][i]]=i;
int sol=0;
for(int i=0;(i+k-1)<n;i++)
sol=max(sol,lcp(val[i],val[i+k-1]));
fout<<sol<<'\n';
// int sol=0,step=(1<<21);
return 0;
}