Pagini recente » Cod sursa (job #2070739) | Cod sursa (job #3211894) | Cod sursa (job #1488075) | Cod sursa (job #1388379) | Cod sursa (job #2402709)
#include <fstream>
#include <algorithm>
#include <vector>
const int NMAX=2000000;
using namespace std;
int z[NMAX+5];
ifstream cin("pscpld.in");
ofstream cout("pscpld.out");
int main()
{
string si,s;
cin>>si;
s="$";
for(int i=0; i<si.size(); ++i)
{
s+=si[i];
s+="$";
}
int r=0,c=0;
for(int i=1; i<(int)s.size(); ++i)
{
if(i>r)
{
while(i-z[i]>=0 && i+z[i]<(int)s.size() && s[i+z[i]]==s[i-z[i]])
z[i]+=1;
}
else
{
int leftover=min(z[c-z[c]+(i-c)],r-i);
z[i]=leftover;
while(i-z[i]>=0 && i+z[i]<(int)s.size() && s[i+z[i]]==s[i-z[i]])
z[i]+=1;
}
if(i+z[i]>r)
{
r=i+z[i];
c=i;
}
// cout<<z[i]<<" ";
}
long long sum=0;
for(int i=1; i<(int)s.size(); ++i)
{
if(s[i]=='$')
sum--;
sum=sum+1LL*(z[i]+1)/2;
}
cout<<sum<<'\n';
return 0;
}