Cod sursa(job #1037000)

Utilizator romykPrehari Romica romyk Data 19 noiembrie 2013 20:11:00
Problema Potrivirea sirurilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include<stdio.h>
#include <string.h>
#include <malloc.h>
using namespace std;
int poz[10001],po=0;;
void preKmp( char* pattern , int pattern_length, int kmpNext[] )
{
    int i , j;
    i = 0;
    j = -1;
    kmpNext[ 0 ] = -1;
    while ( i < pattern_length )
    {
        while ( j > -1 && pattern[ i ] != pattern[ j ] )
            j = kmpNext[ j ];
        i++;
        j++;
        if ( pattern[ i ] == pattern[ j ] )
            kmpNext[ i ] = kmpNext[ j ];
        else
            kmpNext[ i ] = j;
    }
}

void knuth_morris_pratt( char* pattern , int pattern_length , char* source , int source_length )
{
    int i , j;
    int kmpNext[ 20000 ];
    preKmp( pattern , pattern_length , kmpNext );
    i = 0;
    j = 0;
    while ( j < source_length )
    {
        while ( i > -1 && pattern[ i ] != source[ j ] )
            i = kmpNext[ i ];
        i++;
        j++;
        if ( i >= pattern_length )
        {
            poz[po]= j - i;
            po++;
            i = kmpNext[ i ];
        }
    }
}
void readFile(char *code1,char *code2)
{
  FILE *file;
  int i = 0;
  file = fopen("strmatch.in", "r");
  do
  {
    code1[i++] = (char)fgetc(file);
  } while(code1[i-1] != '\n');
  code1[i-1] = '\0';
  i=0;
  do
  {
    code2[i++] = (char)fgetc(file);
  } while(code2[i-1] != '\n');
  code2[i-1] = '\0';
}

int main()
{

    char a[2000000],b[2000000];
    freopen("strmatch.out","w",stdout);
    readFile(a,b);
    knuth_morris_pratt(a ,strlen(a) , b ,strlen(b));
    cout<<po<<endl;
    if(po>1000)
        po=1000;
    for(int i=0;i<po;i++)
    cout<<poz[i]<<" ";
    return 0;
}