Cod sursa(job #2691424)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 28 decembrie 2020 16:14:55
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <string>

using namespace std;

const int NMAX = 1000000;

string input;
string sir = "";

long long sol;
long long lung[1 + 2 * NMAX + 1];

void extindere(int poz)
{
  while (poz - lung[poz] >= 0 && poz + lung[poz] < sir.size() && sir[poz + lung[poz]] == sir[poz - lung[poz]])
  {
    lung[poz]++;
  }
}

int main()
{
  ifstream in("pscpld.in");
  ofstream out("pscpld.out");

  in >> input;

  int lMax = 0;
  int centruMax = -1;

  for (int i = 0; i < input.size(); i++)
  {
    sir += '$';
    sir += input[i];
  }
  sir += '$';

  for (int i = 0; i < sir.size(); i++)
  {
    lung[i] = 1;

    if (centruMax + lMax - 1 < i)
    {
      extindere(i);
    }
    else
    {
      int j = centruMax - (i - centruMax);

      if (j - lung[j] + 1 > centruMax - lMax + 1)
      {
        lung[i] = lung[j];
      }
      else
      {
        lung[i] = centruMax + lMax - i;
        extindere(i);
      }
    }

    if (centruMax + lMax < i + lung[i])
    {
      centruMax = i;
      lMax = lung[i];
    }

    sol += lung[i] / 2;
  }

  out << sol << '\n';

  return 0;
}