1. void exkmp(string& s, vector<int>& z) {
    2. int n = s.size();
    3. z.resize(n, 0);
    4. z[0] = n;
    5. for(int i = 1, l = 0, r = 0; i < n; i++){
    6. if(i <= r) z[i] = min(r - i + 1, z[i - l]);
    7. while(i + z[i] < n && s[i + z[i]] == s[z[i]]) z[i] ++;
    8. if(i + z[i] - 1 > r) {
    9. l = i; r = i + z[i] - 1;
    10. }
    11. }
    12. }