Pagini recente » Cod sursa (job #1114350) | Cod sursa (job #1344719) | Cod sursa (job #1658277) | Cod sursa (job #816242) | Cod sursa (job #2385375)
#include <bits/stdc++.h>
#define BIT(x) (1<<(x))
using namespace std;
struct rec
{
int a, b, c;
bool operator<(const rec& r) const
{
return a < r.a || (a == r.a && b < r.b);
}
};
int n, k;
char s[33000];
int mat[17000][16];
rec v[17000];
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d%d%s", &n, &k, s);
for(int i = 0; i < n; i++)
{
v[i].a = s[i];
v[i].b = 0;
v[i].c = i;
}
sort(v, v + n);
int ind = 0;
rec c = v[0];
for(int i = 0; i < n; i++)
{
if(c.a != v[i].a || c.b != v[i].b)
ind++;
mat[v[i].c][0] = ind;
c = v[i];
}
int p;
for(p = 1; BIT(p + 1) <= n; p++)
{
for(int i = 0; i < n; i++)
{
v[i].a = mat[i][p - 1];
if(i + BIT(p - 1) >= n)
v[i].b = -1;
else v[i].b = mat[i + BIT(p - 1)][p - 1];
v[i].c = i;
}
sort(v, v + n);
int ind = 0;
rec c = v[0];
for(int i = 0; i < n; i++)
{
if(c.a != v[i].a || c.b != v[i].b)
ind++;
mat[v[i].c][p] = ind;
c = v[i];
}
}
p--;
int rez = 0;
for(int i = 0; i < n - k + 1; i++)
{
int x = v[i].c;
int y = v[i + k - 1].c;
int lg = p;
int r = 0;
while(lg >= 0)
{
if(mat[x][lg] == mat[y][lg])
{
r += BIT(lg);
x += BIT(lg);
y += BIT(lg);
}
lg--;
}
rez = max(rez, r);
}
printf("%d", rez);
return 0;
}