Pagini recente » Cod sursa (job #2896473) | Cod sursa (job #357385) | Cod sursa (job #2584335) | Cod sursa (job #2409595) | Cod sursa (job #1460815)
#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 ;
}