Pagini recente » Cod sursa (job #323282) | Cod sursa (job #523342) | Cod sursa (job #2461226) | Cod sursa (job #1134061) | Cod sursa (job #3259611)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int b = 73;
const int mod = 200000000017;
unordered_map <int, int> freq;
string A;
int n, k;
int ok(int ind)
{
int hash = 0;
int p = 1;
for(int i=1; i<=ind; i++)
{
if(i != 1)p = (1ll*p*b)%mod;
hash = (1ll*hash*b + (A[i]-'a'))%mod;
}
freq.clear();
for(int i=ind+1; i<=n; i++)
{
hash = (hash - (A[i - ind] - 'a') * p) % mod;
hash = (1ll*hash*b + (A[i]-'a'))%mod;
freq[hash]++;
if(freq[hash] >= k)return 1;
}
return 0;
}
signed main()
{
fin >> n >> k;
fin >> A;
A = 'a'+A;
int st = 1, dr = n;//verific daca prefixul care se termina in mij apare de k ori
int sol = -1;
while(st <= dr)
{
int mij = (st+dr)/2;
if(ok(mij))
st = mij+1, sol = mij;
else
dr = mij-1;
}
fout << sol;
return 0;
}