Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- using namespace std;
- struct M {int lung, inizioT; M(int a=0, int b=-1){lung=a; inizioT=b;}};
- int inizio(int*T,int dimT,int* P,int dimP, int i,int n){
- //PRE=(dimT>=0, dimP>=0, i=0, n>=0)
- if(dimT==0)//caso base
- return i;
- if(T[0]==P[0])
- i=n;
- inizio(T+1,dimT-1,P,dimP,i,n+1);
- }
- //POST=(i sarà uguale a l'ultimo match di P in T[0...dimT-1]
- //la funzione non è corretta restituisce l'ultimo match e non il miglior match,
- //con appositi test di verifica restituirebbe erroneamente anche un presunto
- // non valido match di lunghezza >=1, che non corrisponde al miglior match.)
- int val_match(int*T,int dimT,int* P,int dimP, int i){
- if(dimP==0||dimT==0)//caso base
- return i;
- if(T[0]==P[0])//continua finche' uguale
- val_match(T+1,dimT,P+1,dimP-1,i+1);
- else
- return i;
- }
- //POST=(i=numero max match trovato in T[0...dimP-1])
- M match(int*T,int dimT,int* P,int dimP, int n){
- //Pre=(dimT>=0, dimP>=0, n=0)
- if(dimT==0)//caso base
- return M();
- if(*T==*P){//T[0]==P[0]
- int a=1;M x;
- x.inizioT=inizio(T,dimT,P,dimP,0,n);
- x.lung=val_match(T+1,dimT-1,P+1,dimP-1,a);
- return (x);
- }
- else
- match(T+1,dimT-1,P,dimP,n+1);
- }
- //POST=(dopo aver analizzato T[0..dimT-1] e P[0..dimP-1] ritorna x
- // and x.inizioT=ultimo best match trovato in T[0...dimT-1]
- // and x.lung=massimo match presente di P in T.)
- main()
- {
- fstream IN("input");
- int T[200]={}, P[20]={}, dimT, dimP;
- IN>>dimT;
- for(int i=0; i<dimT;i++)
- IN>>T[i];
- IN>>dimP;
- for(int i=0; i<dimP;i++)
- IN>>P[i];
- M x=match(T,dimT, P, dimP, 0);// funzione ricorsiva da fare
- cout<<"[lung="<<x.lung<<" inizioT="<<x.inizioT<<']'<<endl; // e' l'occasione di ridefinire << per M
- cout<<"end"<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement