Pagini recente » Cod sursa (job #892325) | Cod sursa (job #310115) | Cod sursa (job #874894) | Cod sursa (job #394475) | Cod sursa (job #2770076)
#include <stdio.h>
#define MAX_N 2000000
int text[MAX_N], pattern[MAX_N], prefix[MAX_N], sol[MAX_N];
int main() {
FILE *fin, *fout;
char ch;
int n, m, nrSol, i, j;
fin = fopen( "strmatch.in", "r" );
ch = fgetc( fin );
m = 0;
while ( ch != '\n' ) {
pattern[m] = ch;
m++;
ch = fgetc( fin );
}
ch = fgetc( fin );
n = 0;
while ( ch != '\n' ) {
text[n] = ch;
n++;
ch = fgetc( fin );
}
prefix[0] = 1;
i = 0;
for ( j = 1; j < m; j++ ) {
if ( pattern[i] == pattern[j] ) {
prefix[j] = prefix[j - 1] + 1;
i++;
} else {
prefix[j] = 0;
i = 0;
}
}
nrSol = 0;
j = 0;
for ( i = 0; i < n; i++ ) {
if ( text[i] == pattern[j] ) {
j++;
if ( j == m ) {
sol[nrSol] = i - m + 1;
nrSol++;
j = prefix[j - 1];
}
} else
j = (j == 0 ? 0 : prefix[j - 1]);
}
fout = fopen( "strmatch.out", "w" );
fprintf( fout, "%d\n", nrSol );
for ( i = 0; i < nrSol; i++ )
fprintf( fout, "%d ", sol[i] );
fclose( fout );
return 0;
}