Cod sursa(job #840864)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 23 decembrie 2012 13:00:43
Problema Potrivirea sirurilor Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#include <string.h>

#define MAXN 2000000

char A[MAXN],B[MAXN];
int P[MAXN];
int m,n;

int solutions[1000];
int nr_sol=0;

// A[0:i] = B[j:j+i]
// P[i] = greatest k (strictly lower than i ) 
// so that A[0:k] matches B[j+i-k:j+i]
// -1 if there is none
void computeDinamicA()
{
	int i;
	P[0] = -1;
	for(i=1;i<m;i++){
		if( A[i] == A[P[i-1]+1] )
			P[i] = P[i-1]+1;
		else
			P[i] = -1;		
	}
	
//	for(i=0;i<m;i++)
//	  printf("%d : %d\n",i,P[i]);
}

int main(int argc, char* argv[])
{
	FILE *fin,*fout;
	fin = fopen("strmatch.in","r");
	fgets(A,MAXN,fin);
	fgets(B,MAXN,fin);
	fclose(fin);
	
	m = strlen(A)-1;
	n = strlen(B)-1;
	A[m] = 0;
	B[n] = 0;
	printf("%d %d",m,n);
	
	computeDinamicA();

	int i,j=-1;
	for(i=0;i<n;i++){
		if( B[i] == A[j+1] ){
			j++;
			if( j == m-1 ){
				if( nr_sol < 1000 )
					solutions[nr_sol] = i-m+1;
				nr_sol++;
				j = P[j];
			}
		}
		else{
			if( P[j] == -1 )
				j = -1;
			else{
				j = P[j];
				i--;
			}			
		}
		
//		printf("Bi=%d, Aj=%d\n",i,j);	
	}

	fout = fopen("strmatch.out","w");
	fprintf(fout,"%d\n",nr_sol);
	if( nr_sol > 1000 )
		nr_sol = 1000;
	for(i=0;i<nr_sol;i++)
		fprintf(fout,"%d ",solutions[i]);

	fclose(fout);
	return 0;
}