Cod sursa(job #790591)

Utilizator S7012MYPetru Trimbitas S7012MY Data 21 septembrie 2012 20:39:39
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
//http://www.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
#include <iostream>
#include <fstream>
#include <cstring>
#define DN 2000005
using namespace std;

int lg[DN]={0,1};//lungimea celui mai lung palindrom cu centrul in i
char s[DN],in[DN];
int centru=1/*centrul celui mai lung palindrom la stanga*/,st,dr,n;
long long rez=1;

int main()
{
    ifstream f("pscpld.in");
    ofstream g("pscpld.out");
    f>>in;
    int lng=strlen(in);
    for(int i=0; i<lng; ++i) {
        s[++n]=in[i];
        if(i<lng-1) s[++n]='#';
    }

    for(int i=2; i<=n; ++i) {
        //min(lg[i'],
        lg[i]=min(lg[centru-(i-centru)]-1,centru+lg[centru]-i);
        lg[i]=max(lg[i],1);

        st=i-lg[i],dr=i+lg[i];
        for(;st>0 && dr<=n && s[st]==s[dr];++lg[i],--st,++dr);

        if(s[i]=='#') rez+=(lg[i]/2);
        else rez+=((lg[i]+1)/2);

        if(i+lg[i]>centru+lg[centru]) centru=i;

    }
    g<<rez;
    return 0;
}