Cod sursa(job #963885)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 19 iunie 2013 17:12:13
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 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;
}