Cod sursa(job #2747530)

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

int dp[2000100];
std::string a = "$";

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

  char ch;
  while(in >> ch) {
    a += ch;
    a += "$";
  }

  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;
}