Cod sursa(job #671024)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 30 ianuarie 2012 16:36:56
Problema Prefix Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<stdio.h>
#include<assert.h>
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

string a;
int sol,prefix[1010000];

void read()
{
    cin >> a;
}

void get_prefix()
{
    int i,j=0;
    prefix[0]=-1;
    for(i=1;i<a.size();++i)
    {
        prefix[i]=-1;
        while(j!=-1)
        {
            if(a[i]==a[j])
            {
                prefix[i]=j;
                ++j;
                break;
            }
            j=prefix[j];
        }
        if(j==-1)
        {
            j=0;
            if(a[i]==a[j])
            {
                prefix[i]=0;
                ++j;
            }
        }
    }
}

void print_prefix()
{
    int i;
    for(i=0;i<a.size();++i)
        printf("%d ",prefix[i]);
    printf("\n");
}

void solve()
{
    get_prefix();
    //print_prefix();
    int i;
    sol=0;
    for(i=1;i<a.size();++i)
        if((i+1)%(i-prefix[i])==0 && prefix[i]!=-1)
            sol=i+1;
}

void write()
{
    printf("%d\n",sol);
}

int main()
{
    assert(freopen("prefix.in","r",stdin)!=NULL);
    assert(freopen("prefix.out","w",stdout)!=NULL);

    int i,t;

    scanf("%d\n",&t);

    for(i=1;i<=t;++i)
    {
        read();
        solve();
        write();
    }

    return 0;
}