Код 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;
}