Pagini recente » Cod sursa (job #1195697) | Cod sursa (job #3258620) | Cod sursa (job #2830716) | Cod sursa (job #18182) | Cod sursa (job #1418533)
#include <cstdio>
#include <algorithm>
#include <vector>
#define Nmax 16390
#define MOD 666013
#define code first
#define nr second
using namespace std;
const int Mod[3] = {699967 , 698669 , 693881};
const int p = 73;
const int p2 = 131;
int n , k;
int hashing[3] , P[3];
vector < pair < int , int > > H[MOD];
char S[Nmax];
int number(int xhashing , bool mod)
{
int ind = xhashing % MOD;
for (int i = 0; i < H[ind].size(); ++i)
if (H[ind][i].code == xhashing) if (mod) return H[ind][i].nr;
else {H[ind][i].nr++; return 1;}
}
void baga(int xhashing)
{
if (number(xhashing , 0)) return;
H[xhashing % MOD].push_back({xhashing , 1});
}
bool check(int lenght)
{
int i , ind , result;
for (i = 0; i < MOD; ++i)
H[i].clear();
hashing[1] = hashing[2] = 0;
for (i = 1; i <= lenght; ++i)
for (ind = 1; ind <= 2; ++ind)
hashing[ind] = (hashing[ind] * p + S[i]) % Mod[ind],
(i > 1) ? P[ind] = (P[ind] * p) % Mod[ind] : P[ind] = 1;
result = (hashing[1] * p2 + hashing[2]) % Mod[0];
baga(result);
if (number(result , 1) >= k) return true;
for (i = lenght + 1; i <= n; ++i)
{
for (ind = 1; ind <= 2; ++ind)
hashing[ind] = ((hashing[ind] - (S[i-lenght] * P[ind]) % Mod[ind] + Mod[ind]) * p + S[i]) % Mod[ind];
result = (hashing[1] * p2 + hashing[2]) % Mod[0];
baga(result);
if (number(result , 1) >= k) return true;
}
return false;
}
int solve()
{
int i , step;
for (step = 1; step < n / k; step <<= 1);
for (i = 0; step; step >>= 1)
if ((i + step) * k <= n && check(i + step))
i += step;
return i;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d\n", &n, &k);
gets(S+1);
printf("%d\n", solve());
return 0;
}