Cod sursa(job #1655487)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 18 martie 2016 00:21:23
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream in("prefix.in");
ofstream out("prefix.out");
const int NMAX = 1000001;
int n,t,length,last,ok;
char a[NMAX];
int ps[NMAX];
int best = 0;
int nr = 0;

void create_table()
{
     int k = 0;
     ps[1] = 0;
     for(int j=2;j<=n;j++)
     {
        while(k>0 && a[k+1]!=a[j])
            k = ps[k];
        if(a[k+1]==a[j])
            k++;
        ps[j] = k;
        if(ps[j]+ps[j]==j && best < j)
            best = j;
     }
     length = ps[best];
}

int main()
{
    in>>t;
    for(int i=1;i<=t;i++)
    {
        in>>(a+1);
        a[0] = '0';
        best = 0;
        n = strlen(a)-1;
        create_table();
        if(best > 1)
        {
            ok = 1;
            last = length;
            nr = 1;
            while(ok)
            {
                for(int j=last+1;j<=last+length;j++)
                {
                    if(a[j]!=a[j-last])
                        ok = 0;
                    if(!ok)
                        break;
                }
                if(ok)
                {
                    last+=length;
                    nr++;
                }
            }
            out<<nr*length<<"\n";
        }
        else
            out<<0<<"\n";
    }
    in.close();
    out.close();
    return 0;
}