Pagini recente » Cod sursa (job #3350826) | Cod sursa (job #3328229) | Cod sursa (job #3347963) | Cod sursa (job #3349684) | Cod sursa (job #3340153)
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int range_rng(int l, int r)
{
return uniform_int_distribution<int>(l,r)(rng);
}
int vl[1000005];
int vr[1000005];
signed main()
{
///*
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
//*/
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,i,j,l,r,sl,sr,mirror,mid,len,ans;
string s,s2;
fin >> s2;
for (auto x : s2)
{
s+='.';
s+=x;
}
s+='.';
l=0;
r=0;
n=s.size();
s="$"+s;
ans=0;
for (i=1; i<=n; i++)
{
if (i<=r)
{
mid=(r+l)/2;
mirror=mid-(i-mid);
len=min(mirror-max(l,vl[mirror]),vr[mirror]-mirror);
sl=i-len;
sr=i+len;
if (sr==r)
{
while (sr+1<=n && sl-1>=1 && s[sr+1]==s[sl-1])
{
sr++;
sl--;
}
vr[i]=sr;
vl[i]=sl;
}
else///se termina pana la r, deci e gata deja
{
vr[i]=sr;
vl[i]=sl;
}
}
else
{
sr=i;
sl=i;
while (sr+1<=n && sl-1>=1 && s[sr+1]==s[sl-1])
{
sr++;
sl--;
}
vr[i]=sr;
vl[i]=sl;
}
if (vr[i]>r)
{
r=vr[i];
l=vl[i];
}
if (s[i]=='.')
ans+=((vr[i]-vl[i])/2)/2;
else
ans+=((vr[i]-vl[i])/2+1)/2;
}
fout << ans;
return 0;
}