Cod sursa(job #1460815)

Utilizator perjulucianPerju Lucian Ionut perjulucian Data 13 iulie 2015 23:45:07
Problema Potrivirea sirurilor Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 2.65 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BAZA 101 // d
#define MODULO 100007 // q
#define MODULO2 100021
typedef struct Queue{
    int val ;
    struct Queue * next ;
}Queue ;

void push_queue(Queue ** first , Queue ** last , int val){
    if( *first == NULL){
 
        *first = (Queue*)malloc(sizeof(Queue));
        (*first)->val = val ;
        *last = *first ;
        (*first)->next = NULL ;
        return ;
    }
    Queue * nou = (Queue*)malloc(sizeof(Queue));
    nou->val =val ;
    nou->next = NULL ;
 
    (*last)->next = nou ;
    *last = nou ;
 
}
int pow_mod(int a,int b){
    int i ;
    int prod = 1 ;
    for ( i = 0 ; i < b ; i++){
        prod = (prod * a) % MODULO ;

    }
    return prod ;
}

int  rabin_karp(char * A , char * B ,int dim_A , int dim_B,Queue ** front ,Queue ** rear ){//dim_a e m
    int h = pow_mod(BAZA,dim_A -1 );
    int p = 0 ;
    int t = 0 ;
    int p2 = 0 ;
    int t2 = 0 ;
    int i ;

    int total = 0;
    for (i = 0 ; i < dim_A ; i++){
        p = (BAZA * p + (int)A[i])%MODULO;
        t = (BAZA * t + (int)B[i])%MODULO; 
        p2 = (BAZA * p2 + (int)A[i])%MODULO;
        t2 = (BAZA * t2 + (int)B[i])%MODULO; 

    }
  
    
    int s ;
    int stop = dim_B - dim_A;
   
    for (s = 0 ; s < stop ; s++){
        
        if(p == t && p2 == t2){

           
           
                push_queue(front,rear,s);    
                total ++ ;
               
        }
        
            t = (BAZA*(t - (int)B[s]*h) + B[s + dim_A ])%MODULO;
            if(t < 0)
                t = t + MODULO ;
            t2 = (BAZA*(t2 - (int)B[s]*h) + B[s + dim_A ])%MODULO;
            if(t2 < 0)
                t2 = t2 + MODULO ;
            
    }
    return total ;
}
int main(){
    FILE * in = fopen("strmatch.in","r");
    FILE * out = fopen("strmatch.out","w");
 
    char * A = NULL ;
    char * B = NULL ;
 
    int dim_A = 0 ,dim_B = 0;
    getline(&A , &dim_A , in);
    dim_A = strlen(A) - 1;
 
    getline(&B , &dim_B , in);
    dim_B = strlen(B);

 
    if(dim_A > dim_B){
        fprintf(out, "0\n" );
        return 0 ;
       } 
 
    Queue * first = NULL , *last = NULL ;
    int stop = dim_B - dim_A ;


//RABIN KARP
    int total = rabin_karp(A,B,dim_A,dim_B,&first,&last);






    fprintf(out, "%d\n",total );
    if(total > 0){
        Queue * cursor = first ;
        Queue * tmp ;
        stop = 0 ;
        while(cursor != NULL && stop <1000){
            tmp = cursor  ;
            fprintf(out, "%d ",cursor->val );
            cursor = cursor->next ;
            //free(tmp );
            stop++;
        }
        fprintf(out, "\n" );
    }    
    
 
    fclose(in);
    fclose(out);
    return 0 ;
}