Pagini recente » Cod sursa (job #83356) | Cod sursa (job #3270069) | Cod sursa (job #1570569) | Cod sursa (job #3210197) | Cod sursa (job #3207714)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
typedef long long ll;
struct node
{
int kids[26];
int lg,suflink;
int cnt;
} emp;
int r1,r2;
vector<node> t;
string s;
int last;
int newnode()
{
int val=t.size();
t.push_back(emp);
return val;
}
bool comp(int a,int b)
{
return t[a].lg>t[b].lg;
}
void add(int poz)
{
int me=last;
int c=s[poz]-'a';
while(true)
{
int p=poz-t[me].lg-1;
if(p>=0&&s[p]==s[poz])
break;
me=t[me].suflink;
}
if(t[me].kids[c]!=-1)
{
last=t[me].kids[c];
t[last].cnt++;
return;
}
last=newnode();
t[me].kids[c]=last;
t[last].lg=t[me].lg+2;
t[last].cnt++;
if(t[me].lg==-1)
{
t[last].suflink=r2;
return;
}
me=t[me].suflink;
while(true)
{
int p=poz-t[me].lg-1;
if(p>=0&&s[p]==s[poz])
break;
me=t[me].suflink;
}
t[last].suflink=t[me].kids[c];
}
int main()
{
//ios_base::sync_with_stdio(false);
//fin.tie(0);
for(int i=0;i<26;i++)
emp.kids[i]=-1;
emp.suflink=-1;
emp.lg=0;
emp.cnt=0;
fin>>s;
r1=newnode();
r2=newnode();
t[r1].lg=-1;
t[r1].suflink=0;
t[r2].lg=0;
t[r2].suflink=0;
last=r1;
for(int i=0;i<s.size();i++)
add(i);
ll ans=0;
vector<int> ord;
for(int i=2;i<t.size();i++)
ord.push_back(i);
sort(ord.begin(),ord.end(),comp);
for(int i:ord)
{
ans+=t[i].cnt;
t[t[i].suflink].cnt+=t[i].cnt;
}
fout<<ans;
return 0;
}