Cod sursa(job #205817)

Utilizator mika17Mihai Alex Ionescu mika17 Data 2 septembrie 2008 23:41:38
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NMAX 2000001
#define min(a,b) (a) < (b) ? (a) : (b)

char T[NMAX],P[NMAX];

int offset[NMAX],nmch;

bool match[NMAX];

void citire()
{
    FILE * fin = fopen("strmatch.in","r");
    fgets(P,NMAX + 1,fin);
    if (P[strlen(P) - 1] == '\n') P[strlen(P) - 1] = '\0'; //fgets o da
    fgets(T,NMAX + 1,fin);
}

void afis()
{
 FILE * fout = fopen("strmatch.out","w");

 fprintf(fout,"%d\n",nmch);

 nmch = min(nmch,1000);

 for(int i = 0, j = 0; i < NMAX & j < nmch ; ++i )
    if(match[i])
       fprintf(fout,"%d ",i), ++j ;
}

void kmp()                 //knuth morris pratt O(N+M)
{
 int N = strlen(T),M = strlen(P);

 for(int i = 1, k = -1; i < M; ++i)
 {
  while( k > 0 & P[k] != P[i])
    k = offset[k];
  if(P[i] == P[k]) ++k;
  offset[i] = k;
 }

 for(int j = -1,i = 0; i < N ; ++i)
 {
  while(j > 0 & T[i] != P[j]) j = offset[j];
  if(T[i] == P[j]) ++j;
  if(j==M)
  {
    match[i - M + 1] = 1 , ++nmch, j = offset[j];
  }         //aici NU se pune break in KMP !!!!!!!!!
 }
}

int main()
{
    citire();
    kmp();
    afis();
}