Cod sursa(job #1628337)

Utilizator pickleVictor Andrei pickle Data 3 martie 2016 23:10:09
Problema Prefix Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <string>

using namespace std;
const int Nmax = 1000666;

string A;
int T, ans = 0, m[Nmax], p[Nmax];

int main() {
  ifstream fin ("prefix.in");
  ofstream fout ("prefix.out");

  fin >> T;
  while(T--) {
    fin >> A;
    for (int i = 0; i <= A.size(); ++i) {
      m[i] = 0;
      p[i] = 0;
    }
    ans = 0;
    m[0] = -1;
    p[0] = 1;
    for (size_t k = 1; k < A.size(); ++k) {
      // find longest prefix of A_k
      int q = m[k-1];
      while(q >= 0) {
        if (A[k] == A[q+1]) {
          m[k] = q+1;
          break;
        }
        q = m[q];
      }

      if (q == -1) {
        if (A[k] == A[0])
          m[k] = 0;
        else
          m[k] = -1;
      }
      // compute the largest period of A_k based on the longest prefix
      p[k] = 1;
      q = m[k];

      if (q >= 0) {
        if ((q+1)/p[q] % (k-q) == 0)
          p[k] = p[q] + 1;
      }

      if (q >= 0 && p[k] > 1 && ans < k+1)
        ans = k+1;

    }
    fout << ans << '\n';
  }

  return 0;
}