Pagini recente » Cod sursa (job #2847199) | Cod sursa (job #3226100) | Cod sursa (job #2701795) | Cod sursa (job #2602546) | Cod sursa (job #2395073)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
const int DN=1e6+5;
int n,m,z;
string s;
long long sol;
struct sdf
{
int pr;
int c[30];
int l;
int fr;
}r[DN];
int main()
{
getline(fin,s);
n=s.size();
s=" "+s;
m=2;
z=2;
r[1].l=-1;
r[1].pr=1;
r[2].pr=1;
for(int i=1;i<=n;i++)
{
//cout<<z<<' '<<r[z].l<<' '<<r[z].pr<<' '<<r[z].fr<<'\n';
while(s[i]!=s[i-1-r[z].l])
{
z=r[z].pr;
//cout<<z<<' '<<r[z].l<<' '<<r[z].pr<<'\n';
}
if(r[z].c[s[i]-'a'])
{
z=r[z].c[s[i]-'a'];
r[z].fr++;
//cout<<z<<'\n';
continue;
}
m++;
r[z].c[s[i]-'a']=m;
r[m].l=r[z].l+2;
if(r[m].l==1)
{
z=m;
r[z].pr=2;
r[z].fr++;
continue;
}
z=r[z].pr;
while(s[i]!=s[i-1-r[z].l])
z=r[z].pr;
z=r[z].c[s[i]-'a'];
r[m].pr=z;
z=m;
r[z].fr++;
}
//cout<<z<<' '<<r[z].l<<' '<<r[z].pr<<' '<<r[z].fr<<'\n';
for(int i=m;i>2;i--)
{
r[r[i].pr].fr+=r[i].fr;
sol+=r[i].fr;
}
fout<<sol;
}