Pagini recente » Cod sursa (job #682138) | Cod sursa (job #2485689) | Istoria paginii runda/c001/clasament | Cod sursa (job #1807768) | Cod sursa (job #1748887)
#include <iostream>
#include <fstream>
#include <vector>
#include <cassert>
#include <map>
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
const int mod1 = 666013;
const int mod2 = 666019;
const int mod = 100019;
map <pair <int, int>, int> aparitii;
int n, k;
string s;
/*
inline void add(int x, int y)
{
int x1 = x % mod;
int y1 = y % mod;
aparitii[x1].push_back(x, y);
}*/
bool verif(int m)
{
//for(int i = 0; i < mod; i++)
// aparitii[i].clear();
aparitii.clear();
int q1 = 1, q2 = 1;
int act1 = 0;
int act2 = 0;
for(int i = 0; i < m - 1; i++)
{
q1 = (q1 * 26) % mod1;
q2 = (q2 * 26) % mod2;
}
for(int i = 0; i < m; i++)
{
act1 = (act1 * 26 + s[i] - 'a' + 1) % mod1;
act2 = (act2 * 26 + s[i] - 'a' + 1) % mod2;
}
for(int i = m; i < n; i++)
{
if(++aparitii[make_pair(act1, act2)] == k)
return 1;
act1 = (act1 - q1 * (s[i - m] - 'a' + 1) % mod1 + mod1) % mod1;
act2 = (act2 - q2 * (s[i - m] - 'a' + 1) % mod2 + mod2) % mod2;
act1 = (act1 * 26 + s[i] - 'a' + 1) % mod1;
act2 = (act2 * 26 + s[i] - 'a' + 1) % mod2;
}
if(++aparitii[make_pair(act1, act2)] == k)
return 1;
return 0;
}
int caut_bin()
{
int st = 1;
int dr = n;
int ret = -1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(verif(mij))
{
ret = mij;
st = mij + 1;
}
else
dr = mij - 1;
}
return ret;
}
int main()
{
in >> n >> k;
getline(in, s);
getline(in, s);
out << caut_bin() << "\n";
return 0;
}