Pagini recente » Cod sursa (job #665094) | Cod sursa (job #1528856) | Cod sursa (job #198247) | Istoria paginii utilizator/dvd46328 | Cod sursa (job #1984598)
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#define MOD1 91121
#define MOD2 666013
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int N, K, i, j;
int Prod1, Prod2;
int Hash1, Hash2;
string s;
vector < pair <int, int> > P;
bool Check(int L)
{
int i, nr=1;
P.clear();
Prod1=Prod2=1;
Hash1=Hash2=0;
for (i=L-1; i>=0; i--)
{
Hash1+=Prod1*s[i];
Hash2+=Prod2*s[i];
Hash1%=MOD1;
Hash2%=MOD2;
if (i!=0)
{
Prod1*=199;
Prod1%=MOD1;
Prod2*=199;
Prod2%=MOD2;
}
}
P.push_back(make_pair(Hash1, Hash2));
for (i=L; i<N; i++)
{
Hash1=(((((Hash1-Prod1*s[i-L]) % MOD1)*199) % MOD1+MOD1)+s[i]) % MOD1;
Hash2=(((((Hash2-Prod2*s[i-L]) % MOD2)*199) % MOD2+MOD2)+s[i]) % MOD2;
P.push_back(make_pair(Hash1, Hash2));
}
sort(P.begin(), P.end());
if (nr==K)
return true;
for (i=1; i<P.size(); i++)
{
if (P[i]==P[i-1])
nr++;
else
nr=1;
if (nr==K)
return true;
}
return false;
}
int Binary_Search()
{
int be=1, en=N;
int mid, ans=0;
while (be<=en)
{
mid=(be+en) / 2;
if (Check(mid)==true)
{
be=mid+1;
ans=mid;
}
else
en=mid-1;
}
return ans;
}
int main()
{
fin >> N >> K;
fin >> s;
fout << Binary_Search() << '\n';
fin.close();
fout.close();
return 0;
}