Pagini recente » Borderou de evaluare (job #2048920) | Cod sursa (job #888240) | Cod sursa (job #2739879)
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
const int r = 1000000007;
char c[17001];
int p[17001];
unordered_map <int, int> m;
bool verif (int lg, int n, int k)
{
int i;
m.clear();
int hash = 0;
for (i = 0; i<lg; i++)
hash = (hash + 1ll * p[lg-i-1] * c[i]) % r;
++m[hash];
for (i = lg; i<n; i++)
{
hash = (131ll * (hash - 1ll * p[lg-1] * c[i-lg] % r + r) + c[i])%r;
++m[hash];
}
for (unordered_map <int, int>::iterator it = m.begin(); it != m.end(); it++)
if (it -> second >= k)
return 1;
return 0;
}
int main()
{
int n, k, i, st, dr, mij;
fin >> n >> k;
fin >> c;
//baza hash-ului va fi 131
p[0] = 1;
for (i = 1; i<=n; i++)
p[i] = 131ll * p[i-1] % r;
st = 0;
dr = n;
while (st <= dr)
{
mij = (st+dr)>>1;
if (verif(mij, n, k) == 1)
st = mij + 1;
else
dr = mij - 1;
}
fout << dr;
return 0;
}