@ http://comeoncodeon.wordpress.com/2010/08/29/the-z-algorithm
bool zAlgorithm(string pattern, string target)
{
string s = pattern + '$' + target ;
int n = s.length();
vector<int> z(n,0);
int goal = pattern.length();
int r = 0, l = 0, i;
for (int k = 1; k<n; k++)
{
if (k>r)
{
for (i = k; i<n && s[i]==s[i-k]; i++);
if (i>k)
{
z[k] = i - k;
l = k;
r = i - 1;
}
}
else
{
int kt = k - l, b = r - k + 1;
if (z[kt]>b)
{
for (i = r + 1; i<n && s[i]==s[i-k]; i++);
z[k] = i - k;
l = k;
r = i - 1;
}
}
if (z[k]==goal)
return true;
}
return false;
}
Thank you. Can you write some sample inputs ?
круче ссылочка https://ejudge.lksh.ru/archive/2013/07/B/z.cpp
Я думаю, данная реализация не так крута, если не знать комментария к ней. Поэтому лучше подойдут страницы параллели B (Июль) и параллели А (Август), с соответствующими ссылками, расположенными на них.
=)
might be interesting https://ejudge.lksh.ru/archive/2013/07/B/z.cpp