Pagini recente » Diferente pentru preoni-2007/runda-finala/poze/deschidere intre reviziile 1 si 2 | Cod sursa (job #1498840) | Cod sursa (job #2009147) | Istoria paginii utilizator/1475369147896537415369 | Cod sursa (job #2684556)
#include <bits/stdc++.h>
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
const int BAZA = 103;
unsigned long long powe[17005],hashes[17005];
unordered_map<unsigned long long,int> m;
char s[17005];
int conv(char s)
{
if(s>='a' && s<='z') return (s-'a');
if(s>='A' && s<='Z') return (s-'A'+26);
return (s-'0'+52);
}
int main()
{
int n,k;
in>>n>>k;
in>>(s+1);
powe[0]=1;
for(int i=1;i<=n;i++)
{
powe[i]=powe[i-1]*BAZA;
hashes[i]=hashes[i-1]*BAZA+conv(s[i])+1;
}
int st=0;
int dr=n;
int ans=0;
while(st<=dr)
{
bool ok=0;
int mid=(st+dr)/2;
for(int i=1;i<=n-mid+1;i++)
{
unsigned long long aux=hashes[i+mid-1]-hashes[i-1]*powe[mid];
m[aux]++;
}
for(auto x:m)
{
if(x.second>=k)
{
ok=1;
ans=mid;
break;
}
}
m.clear();
if(ok==1) {ans=mid;st=mid+1;}
else dr=mid-1;
}
out<<ans<<"\n";
return 0;
}