Cod sursa(job #2305071)

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

const int MAXN=1000000;

using namespace std;

string s;
int z[2*MAXN+5];
long long ans=0;

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

  char c;

  while( cin>>c )
  {
    s.push_back('*');
    s.push_back(c);
  }

  s.push_back('*');

  int st=0, dr=0, n=s.size();

  for( int i=1;i<n-1;i++ )
  {
    if( i>dr )
      z[i]=0;
    else
      z[i]=min(dr-i,z[dr-st+i]);

    while( 0<=i-z[i] && i+z[i]<=n-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];
    }
  }

  cout<<(ans+n/2)/2;

  return 0;
}