Pagini recente » Cod sursa (job #1293980) | Cod sursa (job #967331) | Cod sursa (job #1397056) | Cod sursa (job #135550) | Cod sursa (job #355084)
Cod sursa(job #355084)
#include <cstdio>
#include <algorithm>
using namespace std;
#define x first
#define y second
const int MAX_N = 17000;
const int MAX_LG = 20;
int n, pow, step, sol, k;
char s[MAX_N + 10];
pair <pair <int, int>, int> a[MAX_N];
int p[MAX_LG][MAX_N];
int lcp(int x, int y)
{
int i, ret = 0;
for (i = step; i && x < n && y < n; --i)
if (p[i][x] == p[i][y])
x += 1 << i, y += 1 << i, ret += 1 << i;
return ret;
}
int main()
{
int i;
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d", &n, &k);
fgets(s, MAX_N, stdin);
for (i = 0; i < n; ++i)
p[0][i] = s[i] - 'a';
for (step = 1, pow = 1; pow >> 1 < n; ++step, pow <<= 1)
{
for (i = 0; i < n; ++i)
{
a[i].x.x = p[step - 1][i];
a[i].x.y = (i + pow < n) ? p[step - i][i + pow] : -1;
a[i].y = i;
}
sort(a, a + n);
for (i = 0; i < n; ++i)
p[step][a[i].y] = (i > 0 && a[i].x == a[i - 1].x) ? p[step][a[i - 1].y] : i;
}
--step;
for (i = 0; i <= n - k; ++i)
{
int val = lcp(a[i].y, a[i + k - 1].y);
if (val > sol)
sol = val;
}
printf("%d\n", sol);
}