Pagini recente » Cod sursa (job #2076539) | Istoria paginii runda/boji_round5 | Cod sursa (job #1963912) | Istoria paginii runda/pregg | Cod sursa (job #2770114)
#include <stdio.h>
#define MAX_N 2000000
#define MAX_SOL 1000
int text[MAX_N], pat[MAX_N], lps[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' ) {
pat[m] = ch;
m++;
ch = fgetc( fin );
}
ch = fgetc( fin );
n = 0;
while ( ch != '\n' ) {
text[n] = ch;
n++;
ch = fgetc( fin );
}
i = 1;
j = 0;
while ( i < m ) {
if ( pat[i] == pat[j] ) {
j++;
lps[i] = j;
i++;
} else {
if ( j == 0 ) {
lps[i] = 0;
i++;
} else
j = lps[j - 1];
}
}
nrSol = 0;
i = j = 0;
while ( i < n ) {
if ( text[i] == pat[j] ) {
i++;
j++;
}
if ( j == m ) {
if ( nrSol < MAX_SOL )
sol[nrSol] = i - m;
nrSol++;
j = lps[j - 1];
}
else if ( i < n && text[i] != pat[j] ) {
if ( j == 0 )
i++;
else
j = lps[j - 1];
}
}
fout = fopen( "strmatch.out", "w" );
fprintf( fout, "%d\n", nrSol );
for ( i = 0; i < (nrSol < MAX_SOL ? nrSol : MAX_SOL); i++ )
fprintf( fout, "%d ", sol[i] );
fclose( fout );
return 0;
}