Pagini recente » Cod sursa (job #1289004) | Cod sursa (job #2602482) | Cod sursa (job #2787953) | Cod sursa (job #1213046) | Cod sursa (job #2338738)
#include <fstream>
#include <cstring>
#include <algorithm>
#define v1 first.first
#define v2 first.second
#define poz second
#define DIM 16400
using namespace std;
pair< pair<int, int>, int > L[DIM];
int P[17][DIM];
char s[DIM];
int e, n, k, i, len;
int v[DIM];
int lcp(int i, int j) {
int putere = (1<<e);
int f = e;
int sol = 0;
while (putere) {
if (P[f][i] == P[f][j]) {
i+=putere;
j+=putere;
sol+=putere;
}
f--;
putere /= 2;
}
return sol;
}
int main () {
ifstream fin ("substr.in");
ofstream fout("substr.out");
fin>>n>>k;
fin>>s;
n = strlen(s);
for (i=0;i<n;i++)
P[0][i] = s[i];
for (e=0, len=1;len<=n;e++,len*=2) {
/// calculez linia e+1 din matricea P, adica, avand in P
/// pozitiile din sirul sortat dupa secvente de lungime len,
/// voi calcula pozitiile din sirul sortat considerand secvente de lungime
/// 2*len, si voi memora aceste informatii pe linia e+1
for (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 (i=1;i<n;i++)
if (L[i].v1 == L[i-1].v1 && L[i].v2 == L[i-1].v2)
P[e+1][ L[i].poz ] = P[e+1][ L[i-1].poz ];
else
P[e+1][ L[i].poz ] = P[e+1][ L[i-1].poz ] + 1;
}
for (i=0;i<n;i++)
v[ P[e][i] ] = i;
int sol = 0;
for (i=0;i+k-1<n;i++) {
sol = max(sol, lcp(v[i], v[i+k-1]));
}
fout<<sol;
return 0;
}