Cod sursa(job #1472856)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 17 august 2015 22:05:06
Problema Prefix Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <stdio.h>
#include <string.h>

#define MAX_LEN 1000000

char s[MAX_LEN + 1];
int Z[MAX_LEN + 1];

inline int MIN(int X, int Y) {
  return X < Y ? X : Y;
}

void buildZ(char *s, int length) {
  int l = 0, r = 0;

  for (int i = 0; i < length; i++) {
    Z[i] = 0;
  }
  for (int i = 1; i < length; i++) {
    if (i <= r) {
      Z[i] = MIN(r - i + 1, Z[i - l]);
    }
    while (i + Z[i] < length && s[Z[i]] == s[i + Z[i]]) {
      Z[i]++;
    }
    if (i + Z[i] - 1 > r) {
      r = i + Z[i] - 1;
      l = i;
    }
  }
}

int main(void) {
  int numTests;
  int n;
  int i;
  int q;
  FILE *f = fopen("prefix.in", "r");
  FILE *g = fopen("prefix.out", "w");

  fscanf(f, "%d\n", &numTests);
  for (; numTests; numTests--) {
    fgets(s, MAX_LEN + 1, f);
    n = strlen(s) - 1;
    buildZ(s, n);
    q = 0;
    for (int i = 1; i < n; i++) {
      if ((Z[i] / i) * i > q) {
        q = (Z[i] / i + 1) * i;
      }
    }
    fprintf(g, "%d\n", q);
  }
  fclose(f);
  fclose(g);
  return 0;
}