Pagini recente » Cod sursa (job #2139191) | Cod sursa (job #1742908) | Cod sursa (job #1265315) | Cod sursa (job #1196167) | Cod sursa (job #545288)
Cod sursa(job #545288)
#include <cstdio>
#include <vector>
#include <algorithm>
#define nmax 16455
#define pmax 25
#define mp make_pair
#define poz second
using namespace std;
typedef pair <pair <int, int>, int> iii;
int n, k, log2, x, y, a [pmax] [nmax];
char s [nmax];
iii v [nmax];
void suffix_arrays ()
{
int i, j, x, y, r;
for (j=1; j <= n; ++j)
a [0] [j]=s [j];
for (i=1; ; ++i)
{
for (j=1; j <= n; ++j)
{
x=a [i-1] [j];
y=(j+(1<<(i-1)) <= n)? a [i-1] [j+(1<<(i-1))]:0;
v [j]=mp (mp (x, y), j);
}
sort (v+1, v+1+n);
r=1;
a [i] [v [1].poz]=1;
for (j=2; j <= n; ++j)
if (v [j].first == v [j-1].first)
a [i] [v [j].poz]=r;
else
a [i] [v [j].poz]=++r;
if ((1<<i) > n) break;
}
log2=i;
}
inline int max (int a, int b)
{
return (a>b)? a:b;
}
int lcp (int log2)
{
if (log2 < 0)
return 0;
if (x > n || y > n)
return 0;
if (a [log2] [x] == a [log2] [y])
{
x += 1<<log2;
y += 1<<log2;
return (1<<log2) + lcp (log2-1);
}
return lcp (log2-1);
}
int rez ()
{
int i, m=-1;
pair <int, int> ord [nmax];
for (i=1; i <= n; ++i)
ord [i]=mp (a [log2] [i], i);
sort (ord+1, ord+1+n);
for (i=1; i <= n-k+1; ++i)
{
x=ord [i].poz;
y=ord [i+k-1].poz;
m=max (lcp (log2), m);
}
return m;
}
int main ()
{
freopen ("substr.in", "r", stdin);
freopen ("substr.out", "w", stdout);
scanf ("%d%d%s", &n, &k, s+1);
suffix_arrays ();
printf ("%d\n", rez ());
return 0;
}