Pagini recente » Cod sursa (job #1564680) | Cod sursa (job #2899162) | Rating Fratila Dragos (Kuba) | Cod sursa (job #244487) | Cod sursa (job #758402)
Cod sursa(job #758402)
#include<stdio.h>
FILE *f = fopen("substr.in","r");
FILE *g = fopen("substr.out","w");
#define MaxN 16900
int N,K,Sol,nr,Pi[MaxN];
char A[MaxN],B[MaxN];
void citire(void)
{
fscanf(f,"%d %d\n",&N,&K);
fgets(B,sizeof(B),f);
}
void Prefix(void)
{
int k = -1;
Pi[0] = -1;
for(int i=1;A[i];i++)
{
for(;k > -1 && A[k+1] != A[i];k = Pi[k]);
if(A[k+1] == A[i]) ++ k;
Pi[i] = k;
}
}
void KMP(void)
{
int q = -1;
for(int i=0;B[i];i++)
{
for(;q > -1 && A[q+1] != B[i];q = Pi[q]);
if(A[q+1] == B[i]) ++q;
if(A[q+1] == '\n')
{
++ nr;
q = Pi[q];
}
}
}
inline void CreareString(int i,int l)
{
int a = 0;
l += i-1;
for(;i<=l;Pi[a] = 0,A[a++] = B[i++]);
A[a] = '\n';
A[a+1] = '\0';
}
void Rezolvare(void)
{
for(int i=N;i && nr < K;i--)
for(int j=0;j <= N-i && nr < K;j++)
{
nr = 0;
CreareString(j,i);
Prefix();
KMP();
printf("%d -> %d %s",nr,i,A);
if(nr >= K)
Sol = i;
}
}
int main()
{
citire();
Rezolvare();
fprintf(g,"%d\n",Sol);
}