Cod sursa(job #1172339)

Utilizator ThomasFMI Suditu Thomas Thomas Data 17 aprilie 2014 12:43:57
Problema PalM Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <cstring>
using namespace std;

#define NMax 550

ifstream f("palm.in");
ofstream g("palm.out");

char S[NMax];
int n;
int Pi[NMax],Pp[NMax];

int main()
{
    int i;

    S[0]='a'-1;
    f.get((S+1),503);
    n=strlen(S)-1;
    S[n+2]='\0';
    S[n+1]='a'-2;

    int L,R,C,p,d;

    L=R=C=0;

    //palindrom impar
    for(i=1;i<=n;i++)
    {
        if(i>R)
        {
            p=1;
            while(S[i-p]==S[i+p] && S[i-p+1]>=S[i-p] && S[i+p-1]>=S[i+p]) p++;
            p--;
            Pi[i]=(p<<1)|1;
            L=i-p,R=i+p,C=i;
        }
        else
        {
            d=i-C;

            if(C-d-Pi[C-d]/2<L) p=C-d-L+1;
            else p=Pi[C-d]/2+1;

            while(S[i-p]==S[i+p] && S[i-p+1]>=S[i-p] && S[i+p-1]>=S[i+p]) p++;
            p--;
            Pi[i]=(p<<1)|1;
            if(i+Pi[i]/2>R) L=i-p,R=i+p,C=i;
        }
    }

    L=R=C=0;

    //palindrom par
    for(i=1;i<=n;i++)
    {
        if(i>R)
        {
            if(S[i]==S[i+1])
            {
                p=1;
                while(S[i-p]==S[i+1+p] && S[i-p+1]>=S[i-p] && S[i+p]>=S[i+p+1]) p++;
                Pp[i]=(p<<1);
                Pp[++i]=(p<<1);
                L=i-p+1,R=i+p,C=i;
            } else L=i,R=i,C=i;
        }
        else if(S[i]==S[i+1])
        {
            d=i-C-1;

            if(C-d-Pp[C-d]/2<L) p=C-d-L;
            else p=Pp[C-d]/2;

            while(S[i-p]==S[i+1+p] && S[i-p+1]>=S[i-p] && S[i+p]>=S[i+p+1]) p++;
            Pp[i]=(p<<1);
            Pp[++i]=(p<<1);
            if(i+Pi[i]/2>R) L=i-p+1,R=i+p,C=i;
        }
    }

    int mx=0;
    for(i=1;i<=n;i++)
    {
        if(Pi[i]>mx) mx=Pi[i];
        if(Pp[i]>mx) mx=Pp[i];
    }

    g<<mx<<"\n";

    f.close();
    g.close();
    return 0;
}