Pagini recente » Cod sursa (job #2222376) | Cod sursa (job #513849) | Cod sursa (job #2362657) | Cod sursa (job #941675) | Cod sursa (job #1764820)
#include <stdio.h>
#define B 211
#define MOD2 9478671
#define MOD1 665019
#define MAXN 16384
int q, ans, n, lista[MOD1], next[MAXN+1], val[MAXN+1], fr[MAXN+1], cine[MAXN+1];
char s[MAXN+1];
inline void adauga(int x, int y){
int p=lista[x];
while(p){
if(val[p]==y){
fr[p]++;
if(fr[p]>ans){
ans=fr[p];
}
return ;
}
p=next[p];
}
q++;
val[q]=y;
cine[q]=x;
fr[q]=1;
next[q]=lista[x];
lista[x]=q;
}
inline int apar(int l){
int a=0, b=0, ha=1, hb=1, i;
q=0;
ans=1;
for(i=0; i<l-1; i++){
a=(a*B+s[i])%MOD1;
b=(b*B+s[i])%MOD2;
ha=(ha*B)%MOD1;
hb=(hb*B)%MOD2;
}
for(i=l-1; i<n; i++){
a=(a*B+s[i])%MOD1;
b=(b*B+s[i])%MOD2;
adauga(a, b);
a=(a-(ha*s[i-l+1])%MOD1+MOD1)%MOD1;
b=(b-(hb*s[i-l+1])%MOD2+MOD2)%MOD2;
}
for(i=1; i<=q; i++){
lista[cine[i]]=0;
}
return ans;
}
int main(){
int k, i, rez, pas;
FILE *fin, *fout;
fin=fopen("substr.in", "r");
fout=fopen("substr.out", "w");
fscanf(fin, "%d%d ", &n, &k);
for(i=0; i<n; i++){
s[i]=fgetc(fin);
}
rez=0;
for(pas=1<<16; pas; pas>>=1){
if((rez+pas<=n)&&(apar(rez+pas)>=k)){
rez+=pas;
}
}
fprintf(fout, "%d\n", rez);
fclose(fin);
fclose(fout);
return 0;
}