Cod sursa(job #2345324)

Utilizator PetyAlexandru Peticaru Pety Data 16 februarie 2019 10:53:10
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 2e6;

int st, dr, len;
long long sol;
string s1;
vector<char>s;
int dp[2000002];

int main()
{
  fin >> s1;
  for (int i = 0; i < s1.size(); i++) {
    s.push_back('#');
    s.push_back(s1[i]);
  }
  s.push_back('#');
  st = dr = len = 0;
  for(int i = 0; i < s.size(); i++) {
    if(i > dr)
      len = 0;
    else
      len = min(dr - i, dp[st + dr - i]);
    while(i + len < s.size() && i >= len && s[i - len] == s[i + len])
      len++;
    dp[i] = len;
    len--;
    if(i + len > dr) {
      st = i - len;
      dr = i + len;
    }
  }
  sol += (s.size() - 1) / 2;
  for(int i = 0; i < s.size(); i++)
    sol += (dp[i] - 1) / 2;
  fout << sol;
  return 0;
}