Pagini recente » Cod sursa (job #543934) | Cod sursa (job #691336) | Monitorul de evaluare | Istoria paginii utilizator/matei8787 | Cod sursa (job #479570)
Cod sursa(job #479570)
#include<stdio.h>
#include<string.h>
int *p, n;
char *a;
void prefix(int length){
int k = -1;
p[0] = -1;
for(int 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(int length){
p = new int [length];
prefix(length);
if(length == 1) return 0;
int 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, "%i", &n);
FILE *ofile;
ofile = fopen("prefix.out", "w");
for(int i=0; i<n; i++) {
a = new char[1000001];
fscanf(ifile, "%s", a);
fprintf(ofile, "%i\n", solve(strlen(a)));
delete[] a;
}
fclose(ifile);
fclose(ofile);
}
int main()
{
read();
return 0;
}