Pagini recente » Cod sursa (job #2640435) | Cod sursa (job #2600480) | Cod sursa (job #2032514) | Cod sursa (job #3178281) | Cod sursa (job #2117054)
#include <stdio.h>
#include <string.h>
static char s[1000001];
static size_t pi[1000001];
int main(void)
{
size_t t, i, q, diff;
char *p, found;
freopen("prefix.in", "r", stdin);
freopen("prefix.out", "w", stdout);
scanf("%lu", &t);
while (t--) {
p = s + 1;
fgets(p, sizeof s, stdin);
p[strlen(p) - 1] = '\0';
if (strlen(p) == 0) {
t++;
continue;
}
pi[1] = 0;
q = 0;
for (i = 2; i <= strlen(p); i++) {
while (q > 0 && s[q + 1] != s[i]) {
q = pi[q];
}
if (s[q + 1] == s[i]) {
q++;
}
pi[i] = q;
}
for (i = strlen(p); i > 0; i--) {
diff = i - pi[i];
q = i;
found = 1;
do {
if (q == 2 * diff) {
break;
} else if (pi[q] == 0 || pi[q] % diff != 0) {
found = 0;
}
q -= diff;
} while (found);
if (found) {
break;
}
}
printf("%lu\n", i);
}
return 0;
}