1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| #include <stdio.h> #include <ctype.h> #include <math.h> #include <limits.h> #include <stdlib.h> #include <stdbool.h> #include <string.h>
#define MAXLEN 255 typedef struct{ char ch[MAXLEN]; int length; }SString;
typedef struct{ char *ch; int length; }HString;
void get_next(SString T,int next[]); void get_nextval(SString T,int next[]); int main(){ HString S; S.ch=(char*)malloc(MAXLEN*sizeof(char)); S.length=0; return 0; }
typedef struct{ char ch[MAXLEN]; struct StringNode *next; }StringNode,*String; bool SubString(SString *pSub,SString S,int pos,int len){ if(pos+len-1>S.length){ return false; } int i; for(i=pos;i<pos+len;i++){ pSub->ch[i-pos+1]=S.ch[i]; } pSub->length=len; return true; }
int StrCompare(SString S,SString T){ int i; for(i=1;i<=S.length&&i<=T.length;i++){ if(S.ch[i]!=T.ch[i]){ return S.ch[i]-T.ch[i]; } } return S.length-T.length; }
int Index(SString S,SString T){ int i=1,n=S.length,m=T.length; SString sub; while(i<=n-m+1){ SubString(&sub,S,i,m); if(StrCompare(sub,T)!=0)++i; else{ return 1; } } return 0; }
int next[MAXLEN]; int nextval[MAXLEN]; int Index_KMP(SString S,SString T){ int i=1,j=1; get_next(T,next); get_nextval(T,next); while(i<=S.length&&j<=T.length){ if(j==0||S.ch[i]==T.ch[j]){ ++i,++j; } else{ j=nextval[j]; } } if(j>T.length){ return i-T.length; } else{ return 0; } }
void get_next(SString T,int next[]){ int i=1,j=0; next[1]=0; while(i<T.length){ if(j==0||T.ch[i]==T.ch[j]){ ++i,++j; next[i]=j; } else{ j=next[j]; } } }
void get_nextval(SString T,int next[]){ int j=2; nextval[1]=0; for(j=2;j<=T.length;j++){ if(T.ch[next[j]]==T.ch[j]){ nextval[j]=nextval[next[j]]; } else{ nextval[j]=next[j]; } } }
|