Pagini recente » Cod sursa (job #1368899) | Cod sursa (job #935018) | Cod sursa (job #2251465) | Cod sursa (job #1509345) | Cod sursa (job #1519324)
#include <iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#define m1 1000007
//#define m2 1000007
using namespace std;
int n, k, a;
char s[17000];
int 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)%m1+s[i])%m1;
//nr2=((nr2*123)%m1+s[i])%m2;
if(i>0){
p1=(p1*123)%m1;
//p2=(p2*123)%m2;
}
}
v[++a]=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)%m1+s[i])%m1;
//nr2=nr2-(s[i-k]*p2)%m2;
//if(nr2<0)
// nr2+=m2;
//nr2=((nr2*123)%m2+s[i])%m2;
v[++a]=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);
n=strlen(s);
l1=1;
l2=n;
while(l1<=l2)
{
m=(l1+l2)/2;
a=0;
hashing(m);
sort(v+1, v+a+1);
secv=1;
secvmax=1;
for(i=2;i<=a;i++)
{
if(v[i-1]==v[i])
secv++;
else
{
if(secvmax<secv)
secvmax=secv;
secv=1;
}
}
if(secvmax<secv)
secvmax=secv;
if(secvmax>=k){
if(m>lmax)
lmax=m;
l1=m+1;
}
if(secvmax<k)
l2=m-1;
}
printf("%d", lmax);
return 0;
}