Pagini recente » Cod sursa (job #2512761) | Cod sursa (job #1540573) | Cod sursa (job #2802449) | Cod sursa (job #287781) | Cod sursa (job #1522621)
#include <cstdio>
#define MOD1 666013
#define MOD2 100007
#define BAZA 991
#define MAXN 16384
char v[MAXN];
int x[MAXN],y[MAXN];
inline void swap(int b,int e){
int aux=x[b];
x[b]=x[e];
x[e]=aux;
aux=y[b];
y[b]=y[e];
y[e]=aux;
}
void myqsort(int begin,int end,int *z){
int b=begin,e=end,aux,pivot=z[(b+e)/2];
while(b<=e){
while(z[b]<pivot) b++;
while(z[e]>pivot) e--;
if(b<=e){
swap(b,e);
b++;e--;
}
}
if(begin<e) myqsort(begin,e,z);
if(b<end) myqsort(b,end,z);
}
inline int cauta(int l,int k,int n){
int i,p1,p2,nr1,nr2,max=0,j;
p1=p2=1;
nr1=nr2=0;
for(i=l-1;i>=0;i--){
nr1=(nr1+p1*v[i])%MOD1;
nr2=(nr2+p2*v[i])%MOD2;
if(i>0){
p1=(p1*BAZA)%MOD1;
p2=(p2*BAZA)%MOD2;
}
}
x[0]=nr1;
y[0]=nr2;
for(i=l;i<n;i++){
nr1=(((nr1-(v[i-l]*p1)%MOD1+MOD1)%MOD1)*BAZA+v[i])%MOD1;
nr2=(((nr2-(v[i-l]*p2)%MOD2+MOD2)%MOD2)*BAZA+v[i])%MOD2;
x[i-l+1]=nr1;
y[i-l+1]=nr2;
}
myqsort(0,n-l,x);
i=0;
while(i<n-l+1){
j=i;
while(j<n-l&&x[j]==x[j+1])
j++;
myqsort(i,j,y);
i=j+1;
}
i=0;
while(i<n-l+1){
j=i;
while(j<n-l&&x[j]==x[j+1]&&y[j]==y[j+1])
j++;
if(j-i+1>max)
max=j-i+1;
i=j+1;
}
if(max>=k)
return 1;
return 0;
}
int main(){
FILE*fi,*fout;
int rez,pas,i,n,k;
char a;
fi=fopen("substr.in" ,"r");
fout=fopen("substr.out" ,"w");
fscanf(fi,"%d%d" ,&n,&k);
a=fgetc(fi);
for(i=0;i<n;i++)
v[i]=fgetc(fi);
rez=0;
for(pas=1<<15;pas;pas>>=1)
if(rez+pas<=n&&cauta(rez+pas,k,n)==1)
rez+=pas;
fprintf(fout,"%d" ,rez);
fclose(fi);
fclose(fout);
return 0;
}