Pagini recente » Cod sursa (job #2883055) | Cod sursa (job #470103) | Cod sursa (job #1116202) | Cod sursa (job #43462) | Cod sursa (job #479574)
Cod sursa(job #479574)
#include<stdio.h>
#include<string.h>
long *p, n;
char *a;
void prefix(long length){
long k = -1;
p[0] = -1;
for(long i=1; i<length; i++) {
while(k>=0 && a[k+1] != a[i])
k = p[k];
if(a[k+1] == a[i]) ++k;
p[i] = k;
}
}
int solve(long length){
p = new long[length];
prefix(length);
if(length == 1) return 0;
long start = 0, end = 0, l = 0, s = 0, b;
while(end < length){
for(start = end; start < length && p[start] != 0; start++);
for(end = start+1, b=0; end < length && p[end-1] < p[end]; end++);
if(end - start > l) {
l = end - start;
s = start;
}
}
delete[] p;
if(l < s) return 0;
else return s + l - l%s;
}
void read(){
FILE *ifile;
ifile = fopen("prefix.in", "r");
fscanf(ifile, "%li", &n);
FILE *ofile;
ofile = fopen("prefix.out", "w");
for(long i=0; i<n; i++) {
a = new char[10000000];
fscanf(ifile, "%s", a);
fprintf(ofile, "%li\n", solve(strlen(a)));
delete[] a;
}
fclose(ifile);
fclose(ofile);
}
int main()
{
read();
return 0;
}