Cod sursa(job #479562)

Utilizator Programmer01Mierla Laurentiu Marian Programmer01 Data 24 august 2010 14:47:51
Problema Prefix Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#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, 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[1000000];
		fscanf(ifile, "%s", a);
		fprintf(ofile, "%i\n", solve(strlen(a)));
		delete[] a;
	}

	fclose(ifile);
	fclose(ofile);
}

int main()
{
	read();
	return 0;
}