Pagini recente » Cod sursa (job #979397) | Cod sursa (job #2040676) | Cod sursa (job #1737443) | Cod sursa (job #42155) | Cod sursa (job #778450)
Cod sursa(job #778450)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMAX 17000
struct entry {
int nr[2], p;
} L[NMAX];
int n, k, step, cnt, i, v, result;
char s[NMAX];
int p[50][NMAX], ord[NMAX];
void Build();
int Prefix(int a, int b);
bool cmp(const entry &a, const entry &b) {
return a.nr[0] == b.nr[0] ? (a.nr[1] < b.nr[1]) : (a.nr[0] < b.nr[0]);
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d\n", &n, &k);
scanf("%s", s);
Build();
result = Prefix(ord[0], ord[k-1]);
for (i = 1; i < n-k; ++i)
{
v = Prefix(ord[i], ord[i+k-1]);
if (v > result) result = v;
}
printf("%d\n", result);
return 0;
}
void Build()
{
for (i = 0; i < n; ++i)
p[0][i] = s[i] - 'a';
for (step = 1, cnt = 1; cnt >> 1 < n; ++step, cnt <<= 1)
{
for (i = 0; i < n; ++i)
{
L[i].nr[0] = p[step - 1][i];
L[i].nr[1] = i + cnt < n ? p[step - 1][i + cnt] : -1;
L[i].p = i;
}
std::sort(L, L + n, cmp);
for (i = 0; i < n; ++i)
p[step][L[i].p] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? p[step][L[i - 1].p] : i;
}
for (i = 0; i < n; ++i)
ord[p[step-1][i]] = i;
}
int Prefix(int a, int b)
{
int k, ret = 0;
if (a == b) return n - a;
for (k = step - 1; k >= 0 && a < n && b < n; --k)
if (p[k][a] == p[k][b])
a += 1 << k, b += 1 << k, ret += 1 << k;
return ret;
}