Cod sursa(job #444833)

Utilizator nandoLicker Nandor nando Data 21 aprilie 2010 20:20:29
Problema Prefix Scor 50
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[1]=0;
	for(int i=2,k=0;i<=m;i++){
		while(k && a[k+1]!=a[i])
			k=pi[k];
		if(a[k+1]==a[i])
			k++;
		pi[i]=k;	
	}
}

inline int doTest(){
	a[0]=' ',m=0;
	fgets(a+1,MAXL,fin);
	
	for(m=1;isChar(a[m]);++m,pass[m]=false);
	--m;
	
	make_prefix();
	
	int maxp=0;
	
	for(int i=m,k,l;i;i--){
		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;
			}	
		}	
	}
	if(maxp==2&&a[1]!=a[2]){
		return 0;	
	}else 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;
}