Код Z-функции
Z[i] = число символов, которое совпадет, если мы начнем сравнивать строку S с суффиксом строки S, который начинается с i-й позиции.


#include <stdio.h>
#include <string.h>

#define max_len 100010

char s[max_len];
int n, z[max_len];

int min( int a, int b )
{
  return a < b ? a : b;
}

int main()
{
  int l = 0, r = 0, i, k;

  gets(s), n = strlen(s);
  z[0] = 0;
  for (i = 1; i < n; i++)
  {
    k = 0;
    if (r > i)
      k = min(z[i - l], r - i);
    while (s[k] == s[i + k])
      k++;
    z[i] = k;
    if (z[i] + k > r)
      l = i, r = z[i] + k;
  }
  return 0;
}