Cod sursa(job #758402)

Utilizator maritimCristian Lambru maritim Data 15 iunie 2012 16:28:29
Problema Substr Scor 10
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 0.99 kb
#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);
}