Advertisement
akanoce

2Provatempo

Apr 26th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.01 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. int match(char *T, char *P, int dimT, int dimP);
  8. int not_match(char *T, char x, int dimT);
  9.  
  10. //PRE_F=(T ha dimT elementi definiti e P ne ha dimP, X ha gli elementi che ci servono)
  11. bool F(char* T, char* P,int dimT, int dimP, coppia *X){
  12.    
  13.     if(!dimP)
  14.         return true;    
  15.     else
  16.         if(!dimT)
  17.             return false;
  18.  
  19.     X->salta = not_match(T,*P,dimT);
  20.     X->prendi = match(T+X->salta,P,dimT-X->salta,dimP);
  21.    
  22.    
  23.     return F(T+X->prendi+X->salta,P+X->prendi,dimT-(X->prendi+X->salta),dimP-X->prendi,X+1);
  24.    
  25.    
  26. }//F
  27. //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)
  28.  
  29. /* -- CASO BASE --
  30. - Se dimP == 0 --> ho trovato il match completo
  31. - Se dimT == 0 --> Sono arrivato alla fine di T senza trovare il match
  32.  
  33. Assumendo PRE_F_ric --> la POST_ric è dimostrata
  34.  -- CASO INDUTTIVO --
  35.  //PRE_F_ric=(T+X->prendi ha dimT-(X->prendi+X->salta) elementi definiti e P+X->prendi ne ha dimP-X->prendi, X+1 ha gli elementi che ci servono)
  36.  Ricorsione
  37.  
  38.  -La PRE_F_ric è vera banalmente
  39. -La post è dimostrata dalla POST_F_ric, dato che un match di P è presente in T sse un match (P+(numero di elementi presi)) è presente in (T+(il numero di elementi saltati e presi))
  40. //POST_ric=(restituisce true sse esiste un match completo (con eventuali buchi) di (P+(numero di elementi presi)) in (T+(il numero di elementi saltati e presi)) e, se il match c’è, (X+1) contiene le coppie che corrispondono al match)
  41.  
  42.  
  43.  */
  44. //PRE_m=(T ha dimT elementi definiti e P ne ha dimP)
  45. int match (char* T, char*P, int dimT, int dimP){
  46.    
  47.     if(!dimT || !dimP)
  48.         return 0;
  49.        
  50.     if(*P == *T)
  51.         return 1+match(T+1,P+1,dimT-1,dimP-1);
  52.     else
  53.         return 0;
  54.    
  55.    
  56. }//match
  57. //POST_m=(deve  restituire  la  lunghezza del massimo  prefisso  di  P  che  matcha  a  partire  da  T[0]  in posizioni contigue, cioè senza buchi)
  58.  
  59. /* -- CASO BASE --
  60.  Se  dimP o dimT sono uguali a 0, la funzione ritorna 0, che e' la lunghezza del match piu' lungo che inizia in *T. Vale la POST_m
  61.  Se *T!=*P la la funzione ritorna 0, che e' la lunghezza del match piu' lungo che inizia in T[0]. Vale la POST_m
  62.  
  63.    -- CAS0 RICORSIV0 --
  64. Pre_ric=(T+1 e P+1 hanno almeno rispettivamente dimT-1 e dimP-1 elementi definiti)
  65.  
  66. chiama ricorsiva su T+1
  67.  
  68. POST_ric=(restituisce  la lunghezza del massimo prefisso  di P+1 che matcha a partire da T+1 in posizioni contigue)
  69. Allora al termine della ricorsione, match restituisce lunghezza del match di P che inizia in T. Vale POST_m
  70.  
  71. */
  72.  
  73. //PRE_n=(T ha dimT elementi)
  74. int not_match(char*T, char x, int dimT){
  75.    
  76.     if(!dimT)
  77.         return 0;
  78.        
  79.     if(*T == x)
  80.         return 0;
  81.     else
  82.         return 1+not_match(T+1,x,dimT-1);
  83.    
  84.    
  85. }//not_match
  86. //POST_n=(restituisce il numero di elementi di T da saltare per arrivare a trovare x in T, partendo da  T[0])
  87.  
  88. /*  -- CASO BASE:
  89. - dimP==0, non ho elementi ritorno 0.
  90. - *T==x, subito match ritono 0
  91. CASO RICORSIVO:
  92. PRE_ric=(T+1 ha dimT+1 elementi)
  93. chiamata ricorsiva
  94. POST_ric=(restituisce  il numero di elementi di T+1 da saltare per arrivare a trovare x in T+1 , partendo da T+1)
  95.  
  96. Restituisce quindi il numero di salti da T all'elemento di T che matcha x
  97. */
  98. void stampa(coppia *X){
  99.    
  100.     if(X->prendi != -1 || X->salta != -1){
  101.        
  102.         cout<<"("<<X->salta<<","<<X->prendi<<")";
  103.         return stampa(X+1);
  104.        
  105.     }
  106.     else
  107.         cout<<endl;
  108.    
  109.    
  110.    
  111. }//stampa
  112.  
  113. main()
  114. {
  115.   int dimT, dimP;
  116.   char T[400],P[50];
  117.   coppia X[50];
  118.   for(int i=0; i<50; i++)
  119.     X[i]=coppia(-1,-1);
  120.   cin>> dimT>>dimP;
  121.  
  122.   for(int i=0; i<dimT; i++)
  123.     cin>>T[i];
  124.   for(int i=0; i<dimP; i++)
  125.     cin>>P[i];
  126.   cout<<"start"<<endl;
  127.   if(F(T,P,dimT,dimP,X))
  128.     stampa(X);
  129.    else
  130.     cout<<"nessun match completo"<<endl;
  131.   cout<<"end"<<endl;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement