Pagini recente » Cod sursa (job #3273766) | Cod sursa (job #2642236) | Cod sursa (job #248055) | Cod sursa (job #910770) | Cod sursa (job #2679376)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 1000002
#define in "prefix.in"
#define out "prefix.out"
FILE *fin = fopen(in, "r");
FILE *fout = fopen(out, "w");
int ps[NMAX];
void genFail(char *str, int l) {
int i, j;
ps[0] = ps[1] = 0;
for (i = 1; i < l; ++i) {
j = ps[i];
while (j && str[i] != str[j]) {
j = ps[j];
}
if (str[i] == str[j]) {
j++;
}
ps[i + 1] = j;
}
}
void parseStr(char *str, int l) {
int i;
/* Calculate the "failure" function */
genFail(str, l);
for (i = l; i >= 1; --i) {
/**
* check if at the current index i
* the string has a suffix which is also a prefix
* --> has a period
*/
if (ps[i] && i % (i - ps[i]) == 0) {
break;
}
}
fprintf(fout, "%d\n", i);
}
int main() {
char str[NMAX], s[2];
int N, i, l;
fscanf(fin, "%d", &N);
/* Read '\n' */
fgets(s, 2, fin);
for (i = 0; i < N; ++i) {
fgets(str, NMAX, fin);
l = strlen(str);
str[l - 1] = '\0';
l--;
parseStr(str, l);
}
return 0;
}