Pagini recente » Cod sursa (job #1100914) | Cod sursa (job #2134793) | Cod sursa (job #2272746) | Cod sursa (job #2693229) | Cod sursa (job #1520252)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 16835
#define MOD 1000007
char v[MOD+1];
int f[MOD+1];
int main(){
FILE*fin=fopen("substr.in", "r");
FILE*fout=fopen("substr.out", "w");
int n, i, k, baza, st, dr, m, nr1, max, ok;
fscanf(fin, "%d%d", &n, &k);
fgetc(fin);
for(i=1; i<=n; i++)
v[i]=fgetc(fin);
// for(i=1; i<=n; i++)
// printf("%c", v[i]);
st=1;
dr=n;
max=0;
while(st<=dr){
m=(st+dr)/2;
// printf("\n\nm=%d\n", m);
baza=1;
for(i=1; i<m; i++)
baza=(baza*123)%MOD;
nr1=0;
for(i=1; i<=m; i++)
nr1=(nr1*123+v[i])%MOD;
// printf("baza=%d\n", );
for(i=0; i<=MOD; i++)
f[i]=0;
f[nr1]++;
for(i=2; i<=n-m+1; i++){
nr1=((nr1-(v[i-1]*baza)%MOD+MOD)*123+v[i+m-1])%MOD;
// printf("%d\n", nr1);
f[nr1]++;
}
ok=0;
for(i=0; i<=MOD; i++)
if(f[i]>=k){
ok=1;
if(m>max)
max=m;
}
if(ok==1)
st=m+1;
else
dr=m-1;
// st=dr+1;
}
fprintf(fout, "%d", max);
return 0;
}