Blocks of string#1309

Blocks of string (Editorial)

Сompute the -function for the string and store its values in the array . Print the -function values for all positions i~(0 \le i < n).

Algorithm realization

The input string contains no more than 10^6 characters. The -function of the string is stored in the vector .

vector<int> v;
string s;

The z function computes and returns the -function for the string .

vector<int> z(string s)
{
  int i, l, r, len = s.size();
  vector<int> z(len, 0);
  l = 0, r = 0;
  for (i = 1; i < len; i++)
  {
    if (i <= r) z[i] = min(r - i + 1, z[i - l]);
    while (i + z[i] < len && s[z[i]] == s[i + z[i]]) z[i]++;
    if (i + z[i] - 1 > r)
    { 
      l = i;
      r = i + z[i] - 1;
    }
  }
  return z;
}

The main part of the program. Read the input string .

getline(cin,s);

Compute the -function.

v = z(s);

Print the -function values for all positions of the input string.

for (i = 0; i < v.size(); i++) 
  printf("%d ", v[i]);
printf("\n");