Pagini recente » Cod sursa (job #1443135) | Cod sursa (job #2453309) | Cod sursa (job #2337710) | Cod sursa (job #2172286) | Cod sursa (job #1472870)
#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;
}