Pagini recente » Statistici Andrei Trica (andreitrica) | Cod sursa (job #713477) | Cod sursa (job #2743184) | Cod sursa (job #1176890) | Cod sursa (job #672267)
Cod sursa(job #672267)
#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;
}