Cod sursa(job #2192128)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 4 aprilie 2018 20:08:31
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>
#include <cstring>
#define Nmax 3000005

using namespace std;

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

int man[Nmax];
char a[Nmax], x;
long long ans, len;

void read()
{ a[0]=' ';
    while ( f >> x )
    {
        a[++len]=x;
        a[++len]=' ';
    }
    len--;
}

void manachers()
{
     int mid=1,rgt=1;
     man[1]=1;
    for ( int i = 1 ; i <= len; i ++ )
      {
           man[i] = min(rgt-i, man[2*mid-i]);

           while( a[i+man[i]] == a[i-man[i]] && (i-man[i]>=0) && (i+man[i]<=len ) )
             man[i]++;

           if ( man[i] + i > rgt )
           {
               mid=i;
               rgt=man[i]+i;
           }
      }
}

void solve()
{
  for ( int i = 1 ; i <= len ; i ++ )
      {
            man[i]--;
            man[i]=man[i]/2+i%2;
            ans+=1LL*man[i];
      }
     g << ans;
}

int main()
{
    read();
    manachers();
    solve();

    return 0;
}