Cod sursa(job #2305057)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 19 decembrie 2018 00:02:02
Problema PScPld Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <cstdio>
#include <string>

const int MAXN=1000000;
const int BUFF=4096;

using namespace std;

string s;
int z[2*MAXN+5], p=4095;
long long ans=0;
char buff[BUFF];

char nextch( )
{
  p++;

  if( p==BUFF )
  {
    p=0;
    fread(buff,1,BUFF,stdin);
  }

  return buff[p];
}

/*char getch( )
{
  char c=nextch();

  while( c==' ' )
    c=nextch();

  return c;
}*/

inline int maxim( int a, int b )
{
  if( a<b )
    a=b;

  return a;
}

inline int minim( int a, int b )
{
  if( a>b )
    a=b;

  return a;
}

inline int zet( )
{
  int st=0, dr=0;

  for( int i=1;i<s.size()-1;i++ )
  {
    int l;

    z[i]=minim(maxim(0,dr-i),z[dr-st+i]);

    while( 0<=i-z[i] && i+z[i]<=s.size()-1 && s[i-z[i]]==s[i+z[i]] )
      z[i]++;

    z[i]--;

    ans+=z[i];

    if( i+z[i]>dr )
    {
      st=i-z[i];
      dr=i+z[i];
    }
  }
}

int main()
{
  freopen( "pscpld.in", "r", stdin );
  freopen( "pscpld.out", "w", stdout );

  char c=nextch();

  while( c!='\n' )
  {
    s=s+'*'+c;

    c=nextch();
  }

  s+='*';

  zet();

  cout<<(ans+s.size()/2)/2;

  return 0;
}