Cod sursa(job #2603876)

Utilizator robert.barbu27robert barbu robert.barbu27 Data 21 aprilie 2020 08:47:22
Problema PScPld Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <iostream>
#include <bits/stdc++.h>
#define NMAX 1000000

using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
string s;
char c;
int manacher[2*NMAX+5];
long long sol=0;
int main()
{
while(f>>c)
{
    s=s+'#';
    s=s+c;
}
s=s+'#';
int left=0,right=-1,lung;
int n=s.size();
for(int i=0;i<n;i++)
{
    //cout<<s[i]<<" ";
    if(right<i)
    {
        lung=1;
    }
    else
    {
        int mirror=left+right-i;
        lung=min(manacher[mirror],right-i);
    }
    while(i-lung>=0&&i-lung<=n-1&&s[i-lung]==s[i+lung])
        lung++;
    if(s[i-lung]!=s[i+lung])
        lung--;
        manacher[i]=lung;
    if(i+lung>right)
    {
        right=i+lung;
        left=i-lung;
    }
    if(i%2==1)
    {
        sol=sol+1LL*(manacher[i])/2+1;
    }
    else
    {
        sol=sol+1LL*(manacher[i])/2;
    }
    //cout<<manacher[i]<<" ";

}
g<<sol<<'\n';
}