Pagini recente » Cod sursa (job #444787) | Rating Putineanu Bogdan (Bogdan197) | Cod sursa (job #1517764) | Cod sursa (job #2387943) | Cod sursa (job #1318087)
#include <stdio.h>
#include <stdlib.h>
#define MAXL 1000000
char sir[MAXL + 1];
int p[MAXL];
inline void kmp(int len){
int i, k = 0;
for(i = 1; i < len; i++){
while(k > 0 && sir[i] != sir[k])
k = p[k - 1];
if(sir[i] == sir[k]){
k++;
p[i] = k;
}
else
p[i] = 0;
}
}
inline int prefix(int len){
kmp(len);
int i, max = 0;
for(i = 0; i < len; i++){
if(p[i] > 0){
if((i + 1) % (i + 1 - p[i]) == 0){
max = i + 1;
}
}
}
return max;
}
int main(){
FILE *in = fopen("prefix.in", "r");
FILE *out = fopen("prefix.out", "w");
int t, i, len;
fscanf( in, "%d ", &t );
for ( i = 0; i < t; i++ ){
fgets( sir, MAXL + 1, in );
len = strlen(sir);
len--;
fprintf(out, "%d\n", prefix(len));
}
fclose(in);
fclose(out);
return 0;
}