Pagini recente » Cod sursa (job #1202948) | Cod sursa (job #175948) | Cod sursa (job #1209044) | Cod sursa (job #2655968) | Cod sursa (job #2739876)
#include <fstream>
#include <map>
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
const int r1 = 1000000007;
const int r2 = 1000000207;
char c[17001];
pair <int, int> p[17001];
map <pair <int, int>, int> m;
bool verif (int lg, int n, int k)
{
int i;
m.clear();
pair <int, int> hash = {0, 0};
for (i = 0; i<lg; i++)
{
hash.first = (hash.first + 1ll * c[i] * p[lg-i-1].first) % r1;
hash.second = (hash.second + 1ll * c[i] * p[lg-i-1].second) % r2;
}
++m[hash];
for (i = lg; i<n; i++)
{
hash.first = (131ll * (hash.first - 1ll * p[lg-1].first * c[i-lg] % r1 + r1) + c[i]) % r1;
hash.second = (131ll * (hash.second - 1ll * p[lg-1].second * c[i-lg] % r2 + r2) + c[i]) % r2;
++m[hash];
}
for (map <pair <int, 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, 1};
for (i = 1; i<=n; i++)
{
p[i].first = 131ll * p[i-1].first % r1;
p[i].second = 131ll * p[i-1].second % r2;
}
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;
}