Cod sursa(job #2181632)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 21 martie 2018 19:30:46
Problema Prefix Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define mp make_pair
#define CHECK(x) if(!(x)) return false;
typedef pair<int, int> pii;

#ifdef INFOARENA
#define ProblemName "prefix"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

const int MAXN = 1000010;
char p[MAXN];
int f[MAXN];
int N;

void prec() {
  f[0] = -1, f[1] = 0;
  for (int i = 2; i <= N; ++i) {
    int cur = f[i - 1];
    for (; cur >= 0; cur = f[cur])
      if (p[i - 1] == p[cur])
        break;
    f[i] = cur + 1;
  }
}

int main() {
  freopen(InFile, "r", stdin);
  freopen(OuFile, "w", stdout);
  int T;
  scanf("%d", &T);
  while (T--) {
    int found = 0;
    scanf("%s", p);
    N = strlen(p);
    prec();
    for (int i = 2; i <= N; ++i) {
      int cur = f[i];
      for (; cur > 0; cur = f[cur]) {
        int L = i - cur;
        if (i % L == 0)
          break;
      }
      if(cur > 0)
        found = max(found, i);
    }
    printf("%d\n", found);
  }
  return 0;
}