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