Pagini recente » Teoria jocurilor: numerele Sprague-Grundy | Cod sursa (job #2103564) | Cod sursa (job #1569380) | Arhiva de probleme | Cod sursa (job #1402056)
#include <iostream>
#include <fstream>
#include <tr1/unordered_map>
using namespace std;
ifstream in ("substr.in");
ofstream out ("substr.out");
const int MAXN = 16384 + 10;
const int power = 137;
const int MOD = 666013;
int N, K;
char S[MAXN];
int P[MAXN];
tr1 :: unordered_map <int, int> M;
bool ok (int len)
{
M.clear ();
int hash = 0, i;
int Ans = 1;
for (i = 0; i < len; i ++)
hash = (hash * power + S[i]) % MOD;
M[hash] ++;
for (i = len; i < N; i ++){
hash = (hash - S[i - len] * P[len - 1] + MOD) % MOD;
hash = (hash * power + S[i]) % MOD;
M[hash] ++;
if (M[hash] > Ans)
Ans = M[hash];
}
return (Ans >= K);
}
int bsearch ()
{
int step, i = 0;
for (step = 1; step < N; step *= 2);
for ( ; step; step /= 2)
if (i + step <= N && ok (i + step))
i += step;
return i;
}
int main()
{
in >> N >> K;
in >> S;
P[0] = 1;
for (int i = 1; i <= N; i ++)
P[i] = (P[i - 1] * power) % MOD;
out << bsearch ();
return 0;
}