Cod sursa(job #963261)

Utilizator superman_01Avramescu Cristian superman_01 Data 16 iunie 2013 22:46:28
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#include<utility>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<ctime>


#define MAX_SIZE 1000005
#define get_min(a,b) ((a)>(b)?(a):(b))

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

using namespace std;

typedef vector<int>::iterator IT;

vector<int> Sol;

int tests,len;
int pref[MAX_SIZE];
char sir[MAX_SIZE];

void KMP ( void )
{
	pref[1]=0;
	int i,q;
	for( i = 2 , q = 0 ; i <= len ; ++i )
	{
	     while(q && sir[q+1]!=sir[i])
             q=pref[q];
        if(sir[q+1]	== sir[i] )
            ++q;
         pref[i]=q;
	}
}
void Solve ( void )
{
	int i;
	bool find=false;
	for( i = len ;  i > 0 && !find  ; --i )
	{ 
		if( pref[i] && i % ( i- pref[i]) == 0 )
		{
			Sol.push_back(i);
			find=true;
		}
	}
	if( find == false )
		Sol.push_back(0);
}
void Write ( void )
{
	
	for( IT it=Sol.begin() ; it != Sol.end() ; ++it )
		fprintf(fout,"%d\n",*it);
}
int main ( void )
{
	fscanf(fin,"%d",&tests);
	for( ; tests > 0 ; --tests )
	{
		fscanf(fin,"%s",sir+1);
		len=strlen(sir+1);
		KMP();
		Solve();
    }
	Write();
	fclose(fin);
	fclose(fout);
	return 0;
}