Pagini recente » Cod sursa (job #2219548) | Cod sursa (job #441845) | Cod sursa (job #2650564) | Cod sursa (job #1049664) | Cod sursa (job #2603876)
#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';
}