Pagini recente » Cod sursa (job #3252866) | Cod sursa (job #2224906) | Cod sursa (job #1041142) | Cod sursa (job #286943) | Cod sursa (job #2185645)
#include <bits/stdc++.h>
#define Nmax 16390
#define base1 27
#define base2 5
#define MOD1 100007
#define MOD2 100021
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[Nmax];
int H1[MOD1+5];
int H2[MOD2+5];
int n,k,hash1,hash2,p1,p2;
bool is_good(int len)
{
memset(H1,0,sizeof(H1));
memset(H2,0,sizeof(H2));
hash1=hash2=0;
p1=p2=1;
int i;
for(i=1;i<=len;i++)
{
hash1=(hash1*base1+s[i])%MOD1;
hash2=(hash2*base2+s[i])%MOD2;
if(i>1)
{
p1=(p1*base1)%MOD1;
p2=(p2*base2)%MOD2;
}
}
++H1[hash1];
++H2[hash2];
for(i=len+1;i<=n;i++)
{
hash1=((hash1-(p1*s[i-len])%MOD1+MOD1)*base1+s[i])%MOD1;
hash2=((hash2-(p2*s[i-len])%MOD2+MOD2)*base2+s[i])%MOD2;
++H1[hash1];
++H2[hash2];
if(H1[hash1]>=k and H2[hash2]>=k) return true;
}
return false;
}
int main()
{
f>>n>>k;
f>>(s+1);
int lo=1,hi=n,mid,ans=1;
while(lo<=hi)
{
mid=(lo+hi)>>1;
if(is_good(mid))
{
ans=mid;
lo=mid+1;
}
else hi=mid-1;
}
g<<ans;
return 0;
}