Pagini recente » Cod sursa (job #996727) | Cod sursa (job #1267449) | Cod sursa (job #2643818) | Cod sursa (job #1100302) | Cod sursa (job #967374)
Cod sursa(job #967374)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define Nmax 17000
struct Data
{
int PosA, PosB, Idx;
}L[Nmax];
int PosSuffix[20][Nmax], N, K, Step, Cnt, Suffix[Nmax], NN;
char S[Nmax];
struct Comp
{
bool operator() (Data A, Data B)
{
if(A.PosA == B.PosA) return A.PosB < B.PosB;
return A.PosA < B.PosA;
}
};
int LCP(int X, int Y)
{
if(X == Y) return N - X;
int k, Ans = 0;
for(k = Step - 1; k >= 0 && X < N && Y < N; k --)
if(PosSuffix[k][X] == PosSuffix[k][Y])
{
X += (1 << k);
Y += (1 << k);
Ans += (1 << k);
}
return Ans;
}
void Build_SA()
{
for(int i = 0; i < N; ++ i)
PosSuffix[0][i] = S[i] - 'a';
for(Step = Cnt = 1; Cnt / 2 < N; Cnt *= 2, Step ++)
{
for(int i = 0; i < N; ++ i)
{
L[i].PosA = PosSuffix[Step - 1][i];
L[i].PosB = (i + Cnt < N ? PosSuffix[Step - 1][i + Cnt] : -1);
L[i].Idx = i;
}
sort(L, L + N, Comp());
for(int i = 0; i < N; ++ i)
PosSuffix[Step][ L[i].Idx ] = (i > 0 && L[i].PosA == L[i - 1].PosA && L[i].PosB == L[i - 1].PosB ? PosSuffix[Step][ L[i - 1].Idx ] : i);
}
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%i %i\n", &N, &K);
NN = N;
gets(S);
Build_SA();
for(int i = 0; i < N; ++ i)
Suffix[ PosSuffix[Step - 1][i] ] = i;
int Ans = 0;
for(int i = K; i < N; ++ i)
Ans = max(Ans, LCP(Suffix[i - K + 1], Suffix[i]));
printf("%i\n", Ans);
return 0;
}