Pagini recente » Cod sursa (job #2725792) | Cod sursa (job #482063) | Cod sursa (job #2112155) | Cod sursa (job #2306750) | Cod sursa (job #1471438)
#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];
char s[maxN];
vector < int > V[mod];
void read()
{
freopen("substr.in", "r", stdin);
scanf("%d %d\n", &n, &k);
gets(s + 1);
}
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;
}
int in_hash(int x, int y, int z)
{
int i, app = 0;
for (i = 0; i < V[x % mod].size(); ++ i)
if (scmp(V[x % mod][i], y, z))
++ app;
return app;
}
void Clear()
{
int i;
for (i = 0; i <= mod; ++ i)
V[i].clear();
}
int ok(int x)
{
int i, powb = 1, nr = 0;
for (i = 1; i < x; ++ i)
powb = (powb * b) % mod;
Clear();
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;
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;
}