Pagini recente » Cod sursa (job #1713974) | Cod sursa (job #3233604) | Cod sursa (job #534641) | Cod sursa (job #1198774) | Cod sursa (job #1473069)
#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000000
char s[MAX_LEN + 2]; // terminat cu '\n\0'
int Z[MAX_LEN];
inline int MIN(int X, int Y) {
return X < Y ? X : Y;
}
int main(void) {
int numTests, n;
int l, r;
int q;
FILE *fin = fopen("prefix.in", "r");
FILE *fout = fopen("prefix.out", "w");
fscanf(fin, "%d\n", &numTests);
while (numTests--) {
fgets(s, MAX_LEN + 1, fin);
n = strlen(s) - 1;
l = r = 0;
q = 0;
for (int i = 1; i < n; i++) {
Z[i] = (MIN(r - i + 1, Z[i - l]) & -(i <= r));
while (s[Z[i]] == s[i + Z[i]]) {
Z[i]++;
}
if (i + Z[i] - 1 > r) {
r = i + Z[i] - 1;
l = i;
}
if (Z[i] >= i && Z[i] > Z[q]) {
q = i;
}
}
fprintf(fout, "%d\n", q ? Z[q] / q * q + q : 0);
}
fclose(fin);
fclose(fout);
return 0;
}