Cod sursa(job #444838)

Utilizator nandoLicker Nandor nando Data 21 aprilie 2010 20:35:58
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#include <bitset>
using namespace std;

FILE* fin=fopen("prefix.in","r");
FILE* fout=fopen("prefix.out","w");

#define MAXL 1000005
#define isChar(chr) ('a'<=(chr)&&(chr)<='z')

char a[MAXL];
bitset<MAXL> pass;
int pi[MAXL],m;

void make_prefix(){
	pi[0] = -1;
	for(int i=1,k=-1;i<m;i++){
		while(k >=0 && a[k+1]!=a[i])
			k=pi[k];
		if(a[k+1]==a[i])
			k++;
		pi[i]=k;	
	}
}

inline int doTest(){
	m=0;
	fgets(a,MAXL,fin);
	
	for(m=0;isChar(a[m]);++m,pass[m]=false);

	int maxp=0;
	if(m>1){
		make_prefix();
		
		
		for(int i=m,k,l; i>=0 && !maxp ; i--){
			pass[i]=true;
			int l=i-pi[i];
			
			if(l<=i){
				k = pi[i];
				while(k>=l && !pass[k]){
					if(k-pi[k]!=l)
						break;
					pass[k]=true;
					k=pi[k];
				}
				if( k==l-1 && i+1 > maxp){
					maxp=i+1;
				}	
			}	
		}
	}
	return maxp;
}

int main(){
	int t;
	for(fscanf(fin,"%d\n",&t);t;--t){
		fprintf(fout,"%d\n",doTest());	
	}
	
	fclose(fin);
	fclose(fout);
	return 0;
}