Pagini recente » Cod sursa (job #162752) | Cod sursa (job #1740894) | Cod sursa (job #1120476) | Cod sursa (job #2080257) | Cod sursa (job #2160807)
/*C=1 R=0 i=1
d[1]=1
...
(.I.R...C...R.i.)
d[i] = d[I]
;((.I.),R...C...R,(.i.)),
while pot extinde i
,(i),
d[i]++
C=i
R=raza la care ajunge i=d[i]
i++*/
#include <fstream>
using namespace std;
int sol[2000005];
ifstream f("pscpld.in");
ofstream g("pscpld.out");
long long ans ;
string s;
int main()
{
char a;
s+='*';
while(f>>a)
{
s+=a;
s+='*';
}
int r=-1,c=0,rad;
for(int i=0;i<s.size();i++)
{
if(i<=r)
rad=min(sol[2*c-i],r-i)+1;
else
rad=0;
while(i-rad>=0 && i+rad<s.size() && s[i-rad]==s[i+rad])
rad++;
sol[i] = rad-1;
if(i+sol[i]-1>r)
{
c=i;
r=i+sol[i]-1;
}
}
for(int i=0;i<s.size();++i)
{
ans += (1LL*(sol[i]+1))/2;
}
g<<ans;
return 0;
}