Cod sursa(job #1551209)

Utilizator rares00Foica Rares rares00 Data 15 decembrie 2015 14:59:31
Problema PalM Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
ifstream in("palm.in");
ofstream out("palm.out");
char t[501],s[1002];
int LPS[1002],len,lmax;
void transformaSir(char x[501])
{
    int nr=1;
    int lenX=strlen(x);
    s[0]='#';
    for(int i=0;i<lenX;i++)
    {
        s[i+nr]=x[i];
        s[i+nr+1]='#';
        nr++;
    }
}
void Expand(int i)
{
    /*
    int lg=1;
    bool ok=1;
    while(i-lg>=0 && i+lg<len && ok==1)
    {
        if((i-lg)%2==0)
        {
            LPS[i]++;
            lg++;
        }
        else
        {
            if(s[i-lg]==s[i+lg] && s[i-lg]<=s[i-lg+2] && s[i+lg]<=s[i+lg-2])
            {
                LPS[i]++;
                lg++;
            }
            else
                ok=0;
        }
    }
    */
    bool ok=1;
    while(i-LPS[i]>0 && i+LPS[i]<=len && ok==1)
    {
        if((i-LPS[i]-1)%2==0)
            LPS[i]++;
        else
        {
            if(s[i-LPS[i]-1]==s[i+LPS[i]+1] && s[i-LPS[i]-1]<=s[i-LPS[i]+1])
                LPS[i]++;
            else
                ok=0;
        }
    }
}
int main()
{
    in>>t;
    transformaSir(t);
    //out<<s<<"\n";
    len=strlen(s);

    int C=1, R=2, ii;
    bool expand;
    int cmax=1;
    lmax=1;
    LPS[1]=1;

    for(int i=2;i<len;i++)
    {
        expand=0;
        ii=2*C-i;

        if(i>=R)
            expand=1;
        else
        {
            if(LPS[ii]<R-i)
                LPS[i]=LPS[ii];
            else //LPS[ii]>=R-i
            {
                LPS[i]=R-i;
                expand=1;
            }
        }

        if(expand)
            Expand(i);

        if(lmax<LPS[i])
        {
            lmax=LPS[i];
            cmax=i;
        }

        if(i+LPS[i]>R)
        {
            C=i;
            R=i+LPS[i];
        }
    }

    //for(int i=0;i<len;i++)
    //    out<<LPS[i];
    out<<lmax;
    return 0;
}