Pagini recente » Cod sursa (job #2159529) | Cod sursa (job #743400) | Cod sursa (job #1085056) | Cod sursa (job #1386652) | Cod sursa (job #1519291)
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#define m1 16387
#define m2 1000007
using namespace std;
int n, k, a;
char s[17000];
struct hashuri{ int rest1, rest2;};
hashuri v[17000];
void hashing(int k)
{
int i, p1=1,p2=1, nr1=0, nr2=0;
for(i=0;i<k;i++)
{
nr1=((nr1*123)+s[i])%m1;
nr2=((nr2*123)+s[i])%m2;
if(i>0){
p1*=123;
p2*=123;
}
p1%=m1;
p2%=m2;
}
v[++a].rest1=nr1;
v[a].rest2=nr2;
for(i=k;i<n;i++)
{
nr1=(nr1-(s[i-k]*p1))%m1;
if(nr1<0)
nr1+=m1;
nr1=(nr1*123+s[i])%m1;
nr2=(nr2-(s[i-k]*p2))%m2;
if(nr2<0)
nr2+=m2;
nr2=(nr2*123+s[i])%m2;
v[++a].rest1=nr1;
v[a].rest2=nr2;
}
}
bool cresc(hashuri x, hashuri y){
if(x.rest1<y.rest1)
return true;
if(x.rest1==y.rest1)
if(x.rest2<=y.rest2)
return true;
return false;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int lmax=1, l1, l2, m, secvmax=0, nrap=0, secv=0, i;
scanf("%d%d\n", &n, &k);
gets(s);
l1=1;
l2=n;
while(l1<=l2)
{
m=(l1+l2)/2;
a=0;
hashing(m);
sort(v+1, v+a+1, cresc);
secv=1;
for(i=2;i<=a;i++)
{
if(v[i-1].rest1==v[i].rest1&&v[i-1].rest2==v[i].rest2)
secv++;
else
{
if(secvmax<secv)
secvmax=secv;
secv=1;
}
}
if(secvmax>=k){
lmax=m;
l1=m+1;
}
if(secvmax<k)
l2=m-1;
}
printf("%d", lmax);
return 0;
}