loulett

z_function

Dec 7th, 2015
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5.  
  6. int main() {
  7.     std::string str, t;
  8.     int s_size, t_size;
  9.     std::cin >> str;
  10.     s_size = str.size();
  11.     std::cin >> t;
  12.     str += '#';
  13.     str += t;
  14.  
  15.     std::vector<size_t> z(s_size, 0);
  16.     size_t l = 0, r = 0;
  17.  
  18.     for (size_t i = 1; i < str.size(); ++i) {
  19.         size_t curZ = 0;
  20.         if (i <= r) {
  21.             curZ = std::min(r - i + 1, z[i - l]);
  22.         }
  23.         while (i + curZ < str.size() && str[curZ] == str[i + curZ]) {
  24.             ++curZ;
  25.         }
  26.         if (i + curZ - 1 > r) {
  27.             l = i;
  28.             r = i + curZ - 1;
  29.         }
  30.         if (i < s_size) {
  31.             z[i] = curZ;
  32.         }
  33.         if (i > s_size) {
  34.             if (curZ == s_size) {
  35.                 std::cout << i - s_size - 1 << " ";
  36.             }
  37.         }
  38.     }
  39.     std::cout << "\n";
  40.     return 0;
  41. }
Advertisement
Add Comment
Please, Sign In to add comment