Pagini recente » Cod sursa (job #27452) | Cod sursa (job #2689499) | Cod sursa (job #2426243) | Cod sursa (job #300444) | Cod sursa (job #3259609)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int b = 31;
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]-'0'))%mod;
}
freq.clear();
for(int i=ind+1; i<=n; i++)
{
hash = (hash - (A[i - ind] - '0') * p) % mod;
if(hash < 0)hash+=mod;
hash = (1ll*hash*b + (A[i]-'0'))%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;
}