Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. int KMP(char* s)
  2. {
  3.     int res = 0;    // contatore corrispondenze testo-pattern
  4.     for (int i = 0, j = 0; i < N;) {
  5.         if (s[i] == pattern[j]) {   // c'è corrispondenza tra un carattere del testo e
  6.                                     // uno del pattern
  7.             i++, j++;       // passiamo al carattere successivo
  8.             if (j == M) {   // se j == M significa che è stata troavata una corrispondenza
  9.                             // di lunghezza M, ovvero è stato trovato il pattern all'interno del testo
  10.                 res++;
  11.                 j = lps[j - 1];     // aggiorniamo j saltando i caratteri che a priori corrispondono
  12.             }
  13.         }
  14.         else {
  15.             if (j) j = lps[j - 1];  // se j != 0 aggiorniamo j saltando i caratteri che a priori
  16.                                     // corrispondono per trovare una eventuale corrispondenza in
  17.                                     // un punto precedente del pattern
  18.             else i++;               // se j == 0 non c'è alcuna corrispondenza, quindi andiamo al
  19.                                     // carattere successivo
  20.         }
  21.     }
  22.     return res;
  23. }
  24.  
  25. void init_LPS_array() {
  26.     lps[0] = 0;
  27.     for (int i = 1, j = 0; i < M;)
  28.         if (pattern[i] == pattern[j])   // corrispondenza trovata all'interno del pattern
  29.             lps[i++] = ++j;
  30.         else {
  31.             if (j) j = lps[j - 1];  //  se j != 0 aggiorno j (la corrispondenza potrebbe trovarsi
  32.                                     //  in una porzione precedente del pattern
  33.             else lps[i++] = 0;      //  non c'è corrispondenza
  34.         }
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement