Cod sursa(job #672267)

Utilizator BitOneSAlexandru BitOne Data 1 februarie 2012 20:11:00
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstring>
#include <fstream>
#include <cstdlib>
#define N_MAX 2000011

using namespace std;
typedef unsigned int uint;

uint countMatch;
uint F[N_MAX], match[1001];
char s[N_MAX], pattern[N_MAX];

void FailureFunction( uint patternSize )
{
	uint i, j;
	
	F[0]=F[1]=0; 
	for( i=2, j=0; i <= patternSize; ++i )
	{
		for( ; pattern[i-1] != pattern[j] && j; j=F[j] );
		if( pattern[i-1] == pattern[j] )
			++j;
		F[i]=j;
	}
}
void KMP( uint stringSize, uint patternSize )
{
	uint i, j;
	
	FailureFunction( patternSize );
	for( i=j=0; i < stringSize; )
	{
		if( pattern[j] == s[i] )
		{
			++i, ++j;
			if( j == patternSize )
			{
				++countMatch;
				if( countMatch <= 1000 )
					match[countMatch]=i-patternSize;
			}
		}
		else if( j )
				j=F[j];
			 else ++i;
	} 
	
}
int main()
{
	uint i, N;
	
	ifstream in( "strmatch.in" );
	
	in.getline( pattern, N_MAX-1 );
	in.getline( s, N_MAX-1 );
	KMP( strlen(s), strlen(pattern) );
	
	ofstream out( "strmatch.out" );
	N= countMatch > 1000 ? 1000 : countMatch;
	out<<countMatch<<'\n';
	for( i=1; i <= N; ++i )
		out<<match[i]<<' ';
	out<<'\n';	
	
	return EXIT_SUCCESS;
}