پس از بهینه سازی تابع پیشوند (برای جزئیات اینجا)، الگوریتم نهایی را با مجانبی O(n) بدست می آوریم: ایجاد شد
بردار<int> prefix_function (رشته ها) { int n = (int ) s.length(); بردار<int>pi(n); برای (int i=1; i<n; ++i) { int j = pi[i-1< /span>]؛ در حالی که (j > 0 && s[i] != s[j]) j = پی[j-1]; اگر (s[i] == s[j]) ++ span>j; pi[i] = j; } بازگشتpi; }
S
N
1
i
1000 ms 256 Mb Rules for program design and list of errors in automatic problem checking