Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- int dlugosc(tekst);
- int *init_next(char *wzor);
- int init_shift(char *w, int *shift);
- int KMP(char *tekst, char *wzor, int *next);
- int init_shift(char *w, int *shift);
- main (){
- char tekst[50], wzorzec[5];
- int *next;
- printf("Podaj tekst: ");
- fflush(stdin);
- scanf("%49[^\n]s",tekst);
- printf("Podaj wzorzec: ");
- fflush(stdin);
- scanf("%4[^\n]s",wzorzec);
- next=init_next(wzorzec);
- printf("Wzorzec wystapil na: %d jezeli wartosc jest -1 to nie ma.",KMP(tekst,wzorzec,next));
- getch();
- }
- int dlugosc(char *tekst){
- int i=0;
- while(*(tekst+i)!= '\0'){
- i++;
- }
- return i;
- }
- int *init_next(char *wzor){
- int i,j;
- int M=dlugosc(wzor);
- int *next = malloc(M*sizeof(int));
- next[0] = -1;
- for(i=0,j=-1;i<M-1;i++,j++,next[i]=j){
- while((j>=0)&&(wzor[i]!=wzor[j])){
- j=next[j];
- }
- }
- return next;
- }
- int init_shift(char *w, int *shift){
- int i;
- int M=dlugosc(w);
- shift[256];
- for(i=0;i<256;i++){
- shift[i]=M;
- }
- for(i=0;i<M;i++){
- shift[w[i]]=M-i-1;
- }
- }
- int KMP(char *tekst, char *wzor, int *next){
- int i,j;
- int N=dlugosc(tekst);
- int M=dlugosc(wzor);
- for(i=0,j=0;i<N&&j<M;i++,j++){
- while((j>=0)&&(tekst[i]!=wzor[j])){
- j=next[j];
- }
- }
- if(j==M){
- return i-M;
- }else{
- return -1;
- }
- }
- int BM(char *tekst, char *wzor){
- int i,j;
- char x;
- int N=dlugosc(tekst);
- int M=dlugosc(wzor);
- for(i=M-1,j=M-1;j>=0;i--,j--){
- while(tekst[i]!=wzor[j]){
- x=shift[tekst[i]];
- if(M-j>x){
- i+=M-j;
- }else{
- i+=x;
- }
- if(i>=N){
- return -1;
- }
- j=M-1;
- }
- return i+1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement