Pagini recente » Cod sursa (job #1977368) | Cod sursa (job #1652963) | Cod sursa (job #2918432) | Cod sursa (job #2598927) | Cod sursa (job #2611873)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin("substr.in");
ofstream cout("substr.out");
const int nmax=17000;
const int base=97;
const int MOD=100799;
int n,k;
char arr[nmax];
int fq[MOD+1],pw[nmax],hashh[nmax];
void read()
{
cin>>n>>k;
cin>>(arr+1);
}
void power()
{
pw[0]=1;
for(int i=1;i<=n;i++)
{
pw[i]=pw[i-1]*base;
pw[i]%=MOD;
}
}
int convert(char ch)
{
////ordinea --> abcdef...zABCDEF..Z01234..9
if(ch>='a' && ch<='z')
return (ch-'a');
else if(ch>='A' && ch<='Z')
return (ch-'A'+27);//A va fi al 27-lea character
else if(ch>='0' && ch<='9')
return (ch-'0'+54);//0 va fi al 53-lea
return 0;
}
void hsh()
{
for(int i=1;i<=n;i++)
{
hashh[i]=hashh[i-1]*base+convert(arr[i]);
hashh[i]%=MOD;
}
}
bool ok(int len)
{
memset(fq,0,sizeof(fq));
for(int i=1;i<=n-len+1;i++)
{
int h=hashh[i+len-1]-hashh[i-1]*pw[len];
h%=MOD;
if(h<0)h+=MOD;
fq[h]++;
if(fq[h]>=k)
return true;
}
return false;
}
void solve()
{
int st=0,dr=n,mij,sol=0;
while(st<=dr)
{
mij=(st+dr)/2;
if(ok(mij))
{
sol=mij;
st=mij+1;
}
else
dr=mij-1;
}
cout<<sol;
}
int main()
{
read();
power();
hsh();
solve();
return 0;
}