Pagini recente » Cod sursa (job #510041) | Cod sursa (job #2109622) | Cod sursa (job #504613) | Cod sursa (job #1684689) | Cod sursa (job #1552240)
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
#define Nmax 16384
struct entry
{
int nr[2];
int p;
};
entry L[Nmax+6];
int P[17][Nmax+6],n,k,step;
char A[Nmax+6];
bool comp(const entry& a,const entry& b)
{
if (a.nr[0] == b.nr[0]) return a.nr[1] < b.nr[1];
return a.nr[0] < b.nr[0];
}
void BuildSuffixArray()
{
for (int i = 1; i <= n; i++)
{
if (A[i] >= '0' && A[i] <= '9') P[0][i] = A[i] - '0';
else if (A[i] >= 'A' && A[i] <= 'B') P[0][i] = 10 + A[i] - 'A';
else P[0][i] = 36 + A[i] - 'a';
}
for (step = 1; 1<<step-1 <= n; ++step)
{
for (int i = 1; i <= n; i++)
{
L[i].nr[0] = P[step-1][i];
L[i].nr[1] = (1<<step-1)+i <= n ? P[step-1][(1<<step-1)+i] : -1;
L[i].p = i;
}
sort(L+1,L+n+1,comp);
for (int i = 1; i <= n; i++)
{
if (i > 1 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1])
P[step][L[i].p] = P[step][L[i-1].p];
else
P[step][L[i].p] = i;
}
}
}
int lcp(int x,int y)
{
int k,ret = 0;
if (x == y) return n - x + 1;
for (k = step - 1; x <= n && y <= n && k >= 0; k--)
if (P[k][x] == P[k][y])
x += 1<<k, y += 1<<k, ret += 1<<k;
return ret;
}
int main()
{
ifstream fin("substr.in");
ofstream fout("substr.out");
fin >> n >> k;
fin >> (A+1);
BuildSuffixArray();
int Sol = 0;
for (int i = k; i <= n; i++)
Sol = max (Sol, lcp(L[i].p,L[i-k+1].p));
fout << Sol;
}