#include <bits/stdc++.h>
using namespace std;
vector<int> zMatch(string s) {
vector<int> z(s.size(), 0);
int l = 0, r = 0;
for (int i = 1; i < s.size(); i++) {
if (i < r) {
z[i] = z[i - l];
// Handle case of z[i] reaching for characters
// beyond what we have seen at r
if (i + z[i] > r) {
z[i] = r - i;
}
}
// Look for more batch beyond the current calculation
while(i + z[i] < s.size() && s[z[i]] == s[i + z[i]]) z[i]++;
// Update l, r
if (i + z[i] > r) {
l = i;
r = i + z[i];
}
}
return z;
}
int main() {
vector<int> z = zMatch("aba$ababbababaaa");
for (auto it: z) cout << it << " ";
cout << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50PiB6TWF0Y2goc3RyaW5nIHMpIHsKCXZlY3RvcjxpbnQ+IHoocy5zaXplKCksIDApOwoJaW50IGwgPSAwLCByID0gMDsKCWZvciAoaW50IGkgPSAxOyBpIDwgcy5zaXplKCk7IGkrKykgewoJCWlmIChpIDwgcikgewoJCQl6W2ldID0geltpIC0gbF07CgkJCS8vIEhhbmRsZSBjYXNlIG9mIHpbaV0gcmVhY2hpbmcgZm9yIGNoYXJhY3RlcnMgCgkJCS8vIGJleW9uZCB3aGF0IHdlIGhhdmUgc2VlbiBhdCByCgkJCWlmIChpICsgeltpXSA+IHIpIHsKCQkJCXpbaV0gPSByIC0gaTsKCQkJfQoJCX0KCQkKCQkvLyBMb29rIGZvciBtb3JlIGJhdGNoIGJleW9uZCB0aGUgY3VycmVudCBjYWxjdWxhdGlvbgoJCXdoaWxlKGkgKyB6W2ldIDwgcy5zaXplKCkgJiYgc1t6W2ldXSA9PSBzW2kgKyB6W2ldXSkgeltpXSsrOwoJCQoJCS8vIFVwZGF0ZSBsLCByCgkJaWYgKGkgKyB6W2ldID4gcikgewoJCQlsID0gaTsKCQkJciA9IGkgKyB6W2ldOwoJCX0KCX0KCXJldHVybiB6Owp9CgoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8aW50PiB6ID0gek1hdGNoKCJhYmEkYWJhYmJhYmFiYWFhIik7Cglmb3IgKGF1dG8gaXQ6IHopIGNvdXQgPDwgaXQgPDwgIiAiOwoJY291dCA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0=