Cod sursa(job #1472870)

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

#define MAX_LEN 1000000
#define MAX_TESTS 10

char s[MAX_TESTS * (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 = 1; i < length; i++) {
    Z[i] = 0;
    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 q;
  int ptr;
  FILE *f = fopen("prefix.in", "r");

  fscanf(f, "%d\n", &numTests);
  fread(s, 1, numTests * (MAX_LEN + 1), f);
  fclose(f);

  ptr = 0;
  f = fopen("prefix.out", "w");
  for (; numTests; numTests--) {
    n = 1;
    while (isalpha(s[ptr + n])) {
      n++;
    }
    s[ptr + n] = '\0';
    buildZ(s + ptr, n);
    q = 0;
    for (int i = 1; i < n; i++) {
      int aux = (Z[i] / i) * i;
      if (aux > q) {
        q = aux + i;
      }
    }
    fprintf(f, "%d\n", q);
    ptr += n + 1;
  }
  fclose(f);
  return 0;
}