Pagini recente » Cod sursa (job #2402324) | Cod sursa (job #1616738) | Cod sursa (job #1507159) | Cod sursa (job #1823206) | Cod sursa (job #2394825)
#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,cnt;
char s[DN];
long long sol;
struct sdf
{
int l;
int idx;
int pr;
int c[27]={0};
int fr;
}r[DN];
int main()
{
fin.getline(s+1,DN);
m=1;
r[m].idx=m;
z=m;
for(int i=1;i<=n;i++)
{
while(1)
{
cnt++;
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;
}