Pagini recente » Cod sursa (job #1492818) | Cod sursa (job #377720) | Cod sursa (job #2285301) | Cod sursa (job #2317522) | Cod sursa (job #1480443)
#include <stdio.h>
#include <string.h>
#define Nadejde 2000005
#define Smerenie 1000
int N, M, count;
int pi[Nadejde];
char s[Nadejde];
char p[Nadejde];
int match[Nadejde];
/** Citeste urmatorul sir din fisier. **/
void read(char *str, int *len, FILE *f) {
fgets(str, Nadejde, f);
(*len) = strlen(str) - 1;
}
/** Construieste vectorul "pi". **/
void preprocessing() {
int q, k = 0;
for (q = 1; q < M; q++) {
while ((k > 0) && (p[q] != p[k])) {
k = pi[k - 1];
}
if (p[q] == p[k]) {
k++;
}
pi[q] = k;
}
}
/** Cauta "p" in "s" si retine potrivirile in "match". **/
void kmp() {
int i, q = 0;
preprocessing();
for (i = 0; i < N; i++) {
while ((q > 0) && (s[i] != p[q])) {
q = pi[q - 1];
}
if (s[i] == p[q]) {
q++;
}
if (q == M) {
match[count++] = i - M + 1;
}
}
}
int main(void) {
int i;
FILE *f = fopen("strmatch.in", "r");
read(p, &M, f);
read(s, &N, f);
fclose(f);
f = fopen("strmatch.out", "w");
kmp();
int tmp = count;
count = (count > Smerenie) ? Smerenie : count;
fprintf(f, "%d\n", tmp);
for (i = 0; i < count; i++) {
fprintf(f, "%d ", match[i]);
}
fputc('\n', f);
fclose(f);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}