Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <conio.h>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7.  
  8. void wczytanie(string &tekst, string &wzor);
  9. void naiwny(string tekst, string wzor, int &dlt, int &dlw);
  10. void zbudujKmp(string wzor, int dlw, int p[]);
  11. void KMP(string wzor, string tekst, int dlw, int dlt, int p[]);
  12.  
  13. void wczytanie(string &tekst, string &wzor)
  14. {
  15. cout << "Podaj tekst: ";
  16. getline(cin, tekst);
  17. cout<<"Dlugosc tekstu ze spacjami to: "<< tekst.length() <<endl;
  18.  
  19. cout << "Podaj wzorzec: ";
  20. getline(cin, wzor);
  21. cout<<"Dlugosc wzorca ze spacjami to: "<< wzor.length() <<endl;
  22.  
  23. }
  24.  
  25. void naiwny(string tekst, string wzor, int &dlt, int &dlw)
  26. {
  27. dlt=tekst.length();
  28. dlw=wzor.length();
  29. int i=0;
  30. while (i<=dlt-dlw)
  31. {
  32. int j=0;
  33. while (j<dlw && wzor[j]==tekst[i+j])
  34. {
  35. j++;
  36. }
  37.  
  38. if(j==dlw)
  39. {
  40. cout<<i<<endl;
  41. }
  42.  
  43. i++;
  44. }
  45.  
  46. }
  47.  
  48. void zbudujKmp(string wzor, int dlw, int p[])
  49. {
  50. p[0]=0;
  51. p[1]=0;
  52. int t=0;
  53. int i=1;
  54. while (i<dlw)
  55. {
  56. while (t>0 && wzor[t]!=wzor[i])
  57. {
  58. t=p[t];
  59. }
  60.  
  61. if (wzor[t]==wzor[i])
  62. {
  63. t++;
  64. }
  65.  
  66. p[i+1]=t;
  67. i++;
  68. }
  69. }
  70.  
  71. void KMP(string wzor, string tekst, int dlw, int dlt, int p[])
  72. {
  73. int i=0;
  74. int j=0;
  75.  
  76. while (i<(dlt-dlw+1))
  77. {
  78. while(wzor[j]==tekst[i+j]&&j<dlw)
  79. {
  80. j++;
  81. }
  82.  
  83. if (j==dlw)
  84. {
  85. cout<<i<<endl;
  86. }
  87.  
  88. i=i+max(1,j-p[j]);
  89. j=p[j];
  90. }
  91. }
  92.  
  93. int main()
  94. {
  95. string tekst, wzor;
  96. int dlt, dlw;
  97.  
  98. int wybor;
  99. cout<<"Menu:"<<endl;
  100. cout<<"1.Wczytanie\n2.Algorytm naiwny\n3.Algorytm KMP"<<endl;
  101.  
  102. cout<<"Twoj wybor: ";
  103. wybor=getch();
  104. cout<<char(wybor)<<endl;
  105.  
  106. switch (wybor)
  107. {
  108. case '1':
  109. {
  110. wczytanie(tekst, wzor);
  111. break;
  112. }
  113. case '2':
  114. {
  115. wczytanie(tekst, wzor);
  116. cout<<"ALGORYTM NAIWNY"<<endl;
  117. cout<<"Indeksy elementow w ktorych zaczyna sie wzorzec:"<<endl;
  118. naiwny(tekst, wzor, dlt, dlw);
  119. break;
  120. }
  121. case '3':
  122. {
  123. wczytanie(tekst, wzor);
  124. cout<<"ALGORYTM KMP"<<endl;
  125. cout<<"Indeksy elementow w ktorych zaczyna sie wzorzec:"<<endl;
  126. dlw = wzor.length();
  127. int p[dlw];
  128. zbudujKmp(wzor, dlw, p);
  129. KMP(wzor, tekst, dlw, dlt, p);
  130.  
  131. break;
  132. }
  133. default:
  134. {
  135. cout<<"NIEPOPRAWNY WYBOR!!!";
  136. break;
  137. }
  138. }
  139.  
  140.  
  141.  
  142.  
  143.  
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement