Cod sursa(job #2747547)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 29 aprilie 2021 13:16:01
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <iostream>
#include <fstream>
#include <string>

int dp[2000100];

std::string b;
std::string a;

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

  in >> b;

  a.resize(2 * b.size() + 1);
  a[0] = '$';

  int idx = 0;
  for (char i : b) {
    a[++idx] = i;
    a[++idx] = '$';
  }

  int curr = 0;
  int best_right = 0;
  int64_t ans = 0;

  dp[0] = 1;

  for(int i = 1; i < a.size(); ++i) {
    int len = 1;
    if(i <= best_right)
      len = std::min(dp[2 * curr - i], best_right - i + 1);
    while(i - len >= 0 && i + len < a.size() && a[i + len] == a[i - len]) ++len;

    if(i + len - 1 > best_right)
      best_right = i + len - 1, curr = i;

    dp[i] = len;
    ans += dp[i] / 2;
  }

  out << ans << '\n';

  return 0;
}