Cod sursa(job #1480443)

Utilizator stoianmihailStoian Mihail stoianmihail Data 2 septembrie 2015 16:43:28
Problema Potrivirea sirurilor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.32 kb
#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;
}