Pagini recente » Cod sursa (job #2721190) | Cod sursa (job #1048188)
#include <stdio.h>
#include <map>
#define baza 131
#define mod 9500041
using namespace std;
FILE*f=fopen("substr.in","r");
FILE*g=fopen("substr.out","w");
int n,k,viz[20001];;
char v[20001];
int h[mod+3];
long long X,Y;
void euclid(int a,int b,long long &x,long long &y){
if(!b){
x=1;
y=0;
return ;
}else{
long long x0,y0;
euclid(b,a%b,x0,y0);
x=y0;
y=x0-(a/b)*y0;
}
}
long long invers(int a)
{
X=Y=0;
euclid(a,mod,X,Y);
while(X<=0)
X=mod+X%mod;
return X;
}
int main()
{
fscanf(f,"%d%d\n",&n,&k);
fgets(v+1,n+3,f);
int p=0;
int u=n;
int BAZA=invers(baza);
while(p<=u)
{
int ok=0;
int m=(p+u)/2;
int b=1;
long long nr=0;
nr=v[1];
for(int i=2;i<=m;++i)
{
b*=baza;
b%=mod;
nr+=v[i]*b;
nr%=mod;
}
h[nr]++;
int nr1=0;
viz[++nr1]=nr;
if(k==1)
ok=1;
for(int i=m+1;!ok&&i<=n;++i)
{
nr+=mod-v[i-m];
nr%=mod;
nr*=BAZA;
nr%=mod;
nr+=v[i]*b;
nr%=mod;
h[nr]++;
viz[++nr1]=nr;
if(h[nr]>=k)
{
ok=1;
}
}
if(ok)
p=m+1;
else
u=m-1;
for(int i=1;i<=nr1;++i)
h[viz[i]]=0;
}
fprintf(g,"%d",u);
fclose(f);
fclose(g);
return 0;
}