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
| #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<map> #include<vector>
using namespace std;
bool Matching_Prefix_Suffix(char* P,int k,int q,char c) { if(k==0) return true; if(k==1){ return P[0]==c; } return P[k-1]==c&& (!strncmp(P,P+q-k+1,k-1)); } vector<map<char,int> > Compute_Transition_Function( char *P,const char* input_character) { int m=strlen(P); int j=0,k; printf("The main length of Finite_Automaton_Matcher is %d\n",m); vector<map<char,int> >transition_map(m+1); for(int i=0;i<m;i++){ j=0; while(input_character[j]!='\0'){ k= min(m+1,i+2); do{ k=k-1; }while(!Matching_Prefix_Suffix(P,k,i,input_character[j])); transition_map[i][input_character[j]]=k; j++; } } return transition_map; } void Finite_Automaton_Matcher(char* T,char* P,vector<map<char,int> >transition_map) { int n=strlen(T); int m=strlen(P); int q=0; for(int i=0;i<n;i++){ q = transition_map[q][T[i]]; if(q==m) printf("Pattern occurs with shift %d\n",i+1-m); } }
int main() { const char* input_character="abc"; char T[]="abababacaba"; char P[]="ababaca"; vector<map<char,int> >transition_map=Compute_Transition_Function(P,input_character); Finite_Automaton_Matcher(T,P,transition_map); return 0; }
|