Cod sursa(job #2264133)

Utilizator lucametehauDart Monkey lucametehau Data 19 octombrie 2018 20:26:00
Problema PScPld Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in ("pscpld.in");
ofstream out ("pscpld.out");

const int NMAX = 1e6;

int l, r, lg;
long long sol;
char ch;

string s;
int dp[1 + NMAX];

int main() {
  while(in >> ch) {
    s.push_back('$');
    s.push_back(ch);
  }
  s.push_back('$');
  for(int i = 0; i < s.size(); i++) {
    if(i > r)
      lg = 0;
    else
      lg = min(r - i, dp[l + r - i]);
    while(i + lg < s.size() && i >= lg && s[i - lg] == s[i + lg])
      lg++;
    dp[i] = lg;
    // out << "Intre " << i - lg + 1 << " si " << i + lg - 1 << "\n";
    lg--;
    if(i + lg > r) {
      l = i - lg;
      r = i + lg;
    }
  }
  sol = (s.size() - 1) / 2;
  for(int i = 0; i < s.size(); i++)
    sol += dp[i] - 1;
  out << sol / 2;
  return 0;
}