Pagini recente » Statistici Anda Totilca (andatotalca) | Cod sursa (job #760840) | Cod sursa (job #1256302) | Cod sursa (job #764428) | Cod sursa (job #758412)
Cod sursa(job #758412)
#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],C[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++)
{
if(A[q+1] != B[i])
C[q] ++;
for(;q > -1 && A[q+1] != B[i];q = Pi[q]);
if(A[q+1] == B[i]) ++q;
if(A[q+1] == '\n')
{
C[q] ++;
q = Pi[q];
}
}
}
inline void CreareString(int i,int l)
{
int a = 0;
l += i-1;
for(;i<=l;Pi[a] = C[a] = 0,A[a++] = B[i++]);
A[a] = '\n';
A[a+1] = '\0';
}
void Rezolvare(void)
{
for(int j=0;j <= N-1;j++)
{
nr = 0;
CreareString(j,N-j);
Prefix();
KMP();
C[N-j] = 0;
for(int i=N-j-1;i>=0;i--)
{
C[i] += C[i+1];
if(C[i] >= K && Sol < i+1)
Sol = i+1;
}
//for(int i=0;i<=N-j-1;i++)
// printf("%d ",C[i]);
//printf("\n%d -> %s",nr,A);
}
}
int main()
{
citire();
Rezolvare();
fprintf(g,"%d\n",Sol);
}