Ən böyük sərhəd#1307

Ən böyük sərhəd (Həll təhlili)

sətri üçün massivində prefiks-funksiyanı quracağıq. Əgər sətrinin uzunluğu -dirsə, onda problemi həll etmək üçün sadəcə p[n - 1] dəyərini qaytarmaq kifayətdir.

Alqoritmin realizasiyası

Daxil olan sətir üçün prefiks-funksiyanı massivində qururuq.

string s;
vector<int> p;

MaxBorderArray funksiyası sətri üçün prefiks-funksiyanı hesablayır.

vector<int> MaxBorderArray(string &s)
{
  vector<int> p(s.size()); // p[0] = 0
  for (int i = 1; i < s.size(); i++)
  {
    int j = p[i - 1];
    while ((j > 0) && (s[i] != s[j])) 
      j = p[j - 1];
    if (s[i] == s[j]) p[i] = j + 1; else p[i] = 0;
  }
  return p;
}

sətri üçün prefiks-funksiyanı MaxBorderArray funksiyası ilə qururuq.

cin >> s;
p = MaxBorderArray(s);

Sətirin ən uzun sərhədinin uzunluğunu qaytarırıq, bu p[s.size() - 1]-də yerləşir.

printf("%d\n", p[s.size() - 1]);