Cod sursa(job #1745217)

Utilizator Y0da1NUME JMECHER Y0da1 Data 21 august 2016 14:47:06
Problema Prefix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <string.h>
int T, i, l, rez, prim, ultim, pl, nr, maxl, st, dr;
char str [1000001];
int match[1000001];
using namespace std;
void kmp_match()
{
    match[0]=0;
    int j=0;
    for(i=1;i<l;++i)
    {
        while(j>0 && (str[i]!=str[j]))
            j=match[j-1];

        if(str[i]==str[j])
            ++j;
        match[i]=j;
    }
}
int main ()
{
    ifstream in ("prefix.in");
    ofstream out ("prefix.out");
    in>>T;
    for(int c=0;c<T;++c)
    {
        for(i=0;i<1000002;++i)
        {
            str[i]=0;
            match[i]=0;
        }
        //in.getline(str, 1000001, "\n");
        in>>str;
        //cout<<str<<endl;
        l=strlen(str);
        kmp_match();
        //cout<<endl;
       // for(int k=0;k<l;++k)
        //    cout<<match[k]<<" ";
        //cout<<endl;
        rez=0;
        i=0;
        nr=1;
        maxl=0;
        prim=0;
        ultim=0;
        while(i<l)
        {

            if(match[i]<match[i+1])
            {
                ++nr;
                ++ultim;
            }
            else
            {
                if(nr>maxl)
                {
                    maxl=nr;
                    st=prim;
                    dr=ultim;
                }
                nr=1;
                prim=i+1;
                ultim=i+1;
            }
            ++i;

        }
        if(match[st+1])
        {
            if(match[st]!=0)
            {
                pl=st;
                --st;
            }
            else
                pl=st+1;
        }
            //pl=st+1;
        //cout<<pl<<" "<<st<<" "<<dr;
        rez=pl*((dr+1)/(st+1));
        out<<rez<<"\n";
    }
    in.close();
    out.close();
    return 0;
}