Advertisement
Guest User

Untitled

a guest
Apr 26th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct coppia{int salta,prendi; coppia(int a=0,int b=0){salta=a;prendi=b;}};
  6.  
  7.  
  8. //PRE_m=( T ha dimT elementi definiti e P ne ha dimP)
  9. int match (char* T, char*P, int dimT, int dimP)
  10. {
  11.     //casi base in cui finisco T o P => mi fermo  
  12.     if(dimT || dimP)
  13.     {
  14.         if(*P!=*T)
  15.         return 0;
  16.    
  17.         if(*P==*T)
  18.         return 1+match(T+1, P+1, dimT-1, dimP-1);
  19.     }
  20.     else return 0;
  21. }
  22. //POST_m=(deve restituire la lunghezza del massimo prefisso di P che matcha a partire da T[0] in
  23. //posizioni contigue, cioè senza buchi)
  24. //Si osservi che match può restituire 0.
  25.  
  26.  
  27. //DOVREBBE ESSERE CORRETTA
  28. //PRE_n=(T ha dimT elementi)
  29. int not_match(char*T, char x, int dimT)
  30. {
  31.     if(dimT)
  32.     {
  33.     //lo trova subito => non salta niente;
  34.     if(x==*T)
  35.     return 0;
  36.    
  37.     else
  38.     return 1+not_match(T+1, x, dimT-1);
  39.     }
  40.    
  41.     else return 0;
  42.    
  43.     //esce da ricorsione quando trova corripondenza o quando finisce elementi di T
  44.    
  45.    
  46. }
  47. //POST_n=(restituisce il numero di elementi di T da saltare per arrivare a trovare x in T, partendo da T[0])
  48.  
  49.  
  50.  
  51. //PRE_F=(T ha dimT elementi definiti e P ne ha dimP, X ha gli elementi che ci servono)
  52. bool F(char* T, char* P, int dimT, int dimP, coppia *X) //X è array
  53. {
  54.     //Finiamo T, ma c'è ancora pattern, oppure caso in cui
  55.     if(dimP && !dimT)
  56.     return 0;
  57.    
  58.     if(!dimP)
  59.     return 1;
  60.    
  61.     X->salta=not_match(T, *P, dimT);
  62.     T+=X->salta;
  63.     dimT-=X->salta;
  64.     X->prendi=match (T, P, dimT, dimP);
  65.     return F(T+X->prendi, P+X->prendi, dimT-X->prendi, dimP-X->prendi, X+1);
  66.    
  67.    
  68.    
  69. }
  70. //POST_F=(restituisce true sse esiste un match completo (con eventuali buchi) d P in T e, se il match
  71. //c’è, X contiene le coppie che corrispondono al match)
  72.  
  73. void stampa(coppia *X)
  74. {
  75.     if(X->salta!=-1 && X->prendi!=-1)
  76.     {
  77.         cout << "(" << X->salta << "," << X->prendi << ")";
  78.         stampa (X+1);
  79.     }
  80. }
  81.  
  82. main()
  83. {
  84.   int dimT, dimP;
  85.   char T[400],P[50];
  86.   coppia X[50];
  87.   for(int i=0; i<50; i++)
  88.     X[i]=coppia(-1,-1);
  89.   cin>> dimT>>dimP;
  90.  
  91.   for(int i=0; i<dimT; i++)
  92.     cin>>T[i];
  93.   for(int i=0; i<dimP; i++)
  94.     cin>>P[i];
  95.   cout<<"start"<<endl;
  96.   if(F(T,P,dimT,dimP,X))
  97.     stampa(X);
  98.    else
  99.     cout<<"nessun match completo"<<endl;
  100.   cout<<"end"<<endl;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement