Pagini recente » Cod sursa (job #66563) | Cod sursa (job #2230598) | Cod sursa (job #2931638) | Cod sursa (job #725826) | Cod sursa (job #1460803)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BAZA 101 // d
#define MODULO 59 // q
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 i ;
int ok ;
int total = 0;
for (i = 0 ; i < dim_A ; i++){
p = (BAZA * p + (int)A[i])%MODULO;
t = (BAZA * t + (int)B[i])%MODULO;
}
//pana aici e ok
int s ;
int stop = dim_B - dim_A;
for (s = 0 ; s < stop ; s++){
if(p == t){
ok = 1 ;
for(i = 0 ; i < dim_A ; i++)
if(A[i] != B[s+i]){
ok = 0 ;
break ;
}
if(ok){
push_queue(front,rear,s);
total ++ ;
}
}
t = (BAZA*(t - (int)B[s]*h) + B[s + dim_A ])%MODULO;
if(t < 0)
t = t + 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){
char * aux ;
int auxx ;
aux = A ;
A = B ;
B = aux ;
auxx = dim_A ;
dim_A = dim_B ;
dim_B = auxx ;
}
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 ;
while(cursor != NULL){
tmp = cursor ;
fprintf(out, "%d ",cursor->val );
cursor = cursor->next ;
free(tmp );
}
fprintf(out, "\n" );
}
free(A);
free(B);
fclose(in);
fclose(out);
return 0 ;
}