Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- struct coppia{int salta,prendi; coppia(int a=0,int b=0){salta=a;prendi=b;}};
- //PRE_m=( T ha dimT elementi definiti e P ne ha dimP)
- int match (char* T, char*P, int dimT, int dimP)
- {
- //casi base in cui finisco T o P => mi fermo
- if(dimT || dimP)
- {
- if(*P!=*T)
- return 0;
- if(*P==*T)
- return 1+match(T+1, P+1, dimT-1, dimP-1);
- }
- else return 0;
- }
- //POST_m=(deve restituire la lunghezza del massimo prefisso di P che matcha a partire da T[0] in
- //posizioni contigue, cioè senza buchi)
- //Si osservi che match può restituire 0.
- //DOVREBBE ESSERE CORRETTA
- //PRE_n=(T ha dimT elementi)
- int not_match(char*T, char x, int dimT)
- {
- if(dimT)
- {
- //lo trova subito => non salta niente;
- if(x==*T)
- return 0;
- else
- return 1+not_match(T+1, x, dimT-1);
- }
- else return 0;
- //esce da ricorsione quando trova corripondenza o quando finisce elementi di T
- }
- //POST_n=(restituisce il numero di elementi di T da saltare per arrivare a trovare x in T, partendo da T[0])
- //PRE_F=(T ha dimT elementi definiti e P ne ha dimP, X ha gli elementi che ci servono)
- bool F(char* T, char* P, int dimT, int dimP, coppia *X) //X è array
- {
- //Finiamo T, ma c'è ancora pattern, oppure caso in cui
- if(dimP && !dimT)
- return 0;
- if(!dimP)
- return 1;
- X->salta=not_match(T, *P, dimT);
- T+=X->salta;
- dimT-=X->salta;
- X->prendi=match (T, P, dimT, dimP);
- return F(T+X->prendi, P+X->prendi, dimT-X->prendi, dimP-X->prendi, X+1);
- }
- //POST_F=(restituisce true sse esiste un match completo (con eventuali buchi) d P in T e, se il match
- //c’è, X contiene le coppie che corrispondono al match)
- void stampa(coppia *X)
- {
- if(X->salta!=-1 && X->prendi!=-1)
- {
- cout << "(" << X->salta << "," << X->prendi << ")";
- stampa (X+1);
- }
- }
- main()
- {
- int dimT, dimP;
- char T[400],P[50];
- coppia X[50];
- for(int i=0; i<50; i++)
- X[i]=coppia(-1,-1);
- cin>> dimT>>dimP;
- for(int i=0; i<dimT; i++)
- cin>>T[i];
- for(int i=0; i<dimP; i++)
- cin>>P[i];
- cout<<"start"<<endl;
- if(F(T,P,dimT,dimP,X))
- stampa(X);
- else
- cout<<"nessun match completo"<<endl;
- cout<<"end"<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement