fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. vector<int> zMatch(string s) {
  5. vector<int> z(s.size(), 0);
  6. int l = 0, r = 0;
  7. for (int i = 1; i < s.size(); i++) {
  8. if (i < r) {
  9. z[i] = z[i - l];
  10. // Handle case of z[i] reaching for characters
  11. // beyond what we have seen at r
  12. if (i + z[i] > r) {
  13. z[i] = r - i;
  14. }
  15. }
  16.  
  17. // Look for more batch beyond the current calculation
  18. while(i + z[i] < s.size() && s[z[i]] == s[i + z[i]]) z[i]++;
  19.  
  20. // Update l, r
  21. if (i + z[i] > r) {
  22. l = i;
  23. r = i + z[i];
  24. }
  25. }
  26. return z;
  27. }
  28.  
  29.  
  30. int main() {
  31. vector<int> z = zMatch("aba$ababbababaaa");
  32. for (auto it: z) cout << it << " ";
  33. cout << endl;
  34. return 0;
  35. }
Success #stdin #stdout 0s 5308KB
stdin
Standard input is empty
stdout
0 0 1 0 3 0 2 0 0 3 0 3 0 1 1 1