Pagini recente » Cod sursa (job #155272) | Cod sursa (job #2637672) | Cod sursa (job #1280989) | Cod sursa (job #373766) | Cod sursa (job #1471441)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define b 26
#define mod 46103
#define maxN 16386
using namespace std;
int n, k, v[maxN], P[maxN];
char s[maxN];
vector < int > V[mod];
void read()
{
int i;
freopen("substr.in", "r", stdin);
scanf("%d %d\n", &n, &k);
gets(s + 1);
P[0] = 1;
for (i = 1; i <= n; ++ i)
P[i] = (P[i - 1] * b) % mod;
}
inline int scmp(int x, int y, int z)
{
int i;
for (i = 1; i <= z; ++ i)
if (s[i + x] != s[i + y])
return 0;
return 1;
}
inline int in_hash(int x, int y, int z)
{
int i, app = 0;
for (i = 0; i < V[x].size(); ++ i)
if (scmp(V[x][i], y, z))
++ app;
return app;
}
void Clear()
{
int i;
for (i = 0; i <= mod; ++ i)
V[i].clear();
}
inline int ok(int x)
{
int i, powb = 1, nr = 0;
powb = P[x - 1];
for (i = 1; i <= n; ++ i)
{
if (i > x)
nr = (nr - ((powb * (s[i - x] - 'a')) % mod) + mod) % mod;
nr = (nr * b + (s[i] - 'a')) % mod;
while (nr < 0)
nr += mod;
if (i >= x)
{
v[i - x] = nr;
V[nr].push_back(i - x);
if (in_hash(v[i - x], i - x, x) >= k)
return 1;
}
}
return 0;
}
int bs()
{
int i = 0, p = 1 << 14;
while (p)
{
if (i + p <= n && ok(i + p))
i += p;
p /= 2;
}
return i;
}
void write()
{
freopen("substr.out", "w", stdout);
printf("%d", bs());
}
int main()
{
read();
write();
return 0;
}