Cod sursa(job #1202048)

Utilizator legionarulCorneliu Zelea Codreanu legionarul Data 26 iunie 2014 18:52:26
Problema Prefix Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
# include <fstream>
# include <algorithm>
# include <cstring>
# include <vector>

# define dim 1000005

using namespace std;

ifstream f("prefix.in");
ofstream g("prefix.out");

char a[ dim ];
int p[ dim ];
int t, lg_a;

void rezolva()
{
	int i, sol = 0;
	for ( i = lg_a ; i >= 2 ; i-- )
	{
		if ( i % ( i - p[ i ] ) == 0  && p[ i ] != 0 )
			sol = max( sol, i );
		p[ i ] = 0;
	}
	p[ 1 ] = 0;
		g << sol << "\n";
}

void prefix()
{
	int i, q = 0;
	p[ 1 ] = 0;
	for ( i = 2 ; i <= lg_a ; i++ )
	{
		while ( q > 0 && a[ q + 1 ] != a[ i ] )
			q = p[ q ];
		if ( a[ q + 1 ] == a[ i ] )
			q++;
		p[ i ] = q;
	}
	
//	for ( i = 1 ; i <= lg_a ; i++ )
	//	g << p[ i ];
//	g << "\n";
}

void citire()
{
	int i, j;
	f >> t;
	f.get();
	for ( i = 1 ; i <= t ; i++ )
	{
		f.getline( a + 1, sizeof( a  ) + 1 );
		//scanf("%s",( a + 1 ) );
		lg_a = strlen( a + 1 );
		//for ( j = lg_a ; j >= 1 ; j-- )
			//a[ j ] = a[ j - 1 ];
		//a[ 0 ] = ' ';
		//g << a << "\n";
		prefix();
		rezolva();
	}
}

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