Cod sursa(job #2749297)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 6 mai 2021 11:24:50
Problema Prefix Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>

const int NMAX = 1e6;

int pi[1 + NMAX];

std::string a;

int main() {
  std::ifstream in("prefix.in");
  std::ofstream out("prefix.out");

  int tests;
  in >> tests;

  while (tests--) {
    in >> a;
    int ans = 0;

    memset(pi, 0, sizeof(pi));

    a = "." + a;

    int k = 0;
    pi[1] = 0;

    for (int i = 2; i < a.size(); ++i) {
      while (k > 0 && a[k + 1] != a[i])
        k = pi[k];

      if (a[k + 1] == a[i])
        ++k;

      pi[i] = k;
    }

    int seq_start = -1;
    for (int i = 1; i < a.size(); ++i) {
      if (pi[i] == 1) {
        seq_start = i;

        while (i + 1 < a.size() && pi[i + 1] == pi[i] + 1)
          ++i;

        // { seq_start , i }

        int len = i - seq_start + 1;
        int period_len = seq_start - 1;
        int k = len / period_len + 1;

        if (k > 1)
          ans = std::max(ans, k * period_len);
      }
    }

    out << ans << '\n';
  }

  return 0;
}