Pagini recente » Cod sursa (job #270897) | Cod sursa (job #3286530) | Cod sursa (job #1455487) | Cod sursa (job #1286773) | Cod sursa (job #1402059)
#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;
typedef unsigned long long ULL;
int N, K;
char S[MAXN];
ULL P[MAXN];
tr1 :: unordered_map <ULL, 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];
M[hash] ++;
for (i = len; i < N; i ++){
hash = hash - S[i - len] * P[len - 1];
hash = hash * power + S[i];
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;
out << bsearch ();
return 0;
}