对着别人程序打的。。。好歹打出来了是吧
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct Node
{
int len;
Node *ch[31];
Node *last;
int num;
Node(){for(len=0;len<=30;len++)ch[len]=NULL;last=NULL;len=num=0;}
};
Node*Max_Node,*Node_2,*Node_1;
int num;
char s[100001];
inline void begin(){Node_2=new Node;Node_1=new Node;Max_Node=Node_2;num=2;Node_2->last=Node_1->last=Node_1;Node_1->len=-1;Node_2->len=0;}
inline bool add(int place)
{
bool Exit=false;
Node *cur=Max_Node;
int curlen=0,son=s[place]-'a';
while(true)
{
curlen=cur->len;
if(place-1-curlen>=0&&s[place-1-curlen]==s[place])
break;
cur=cur->last;
}
if(cur->ch[son])
Max_Node=cur->ch[son];
else
{
Exit=true;
Node*tp=new Node;
Max_Node=tp;
tp->len=cur->len+2;
cur->ch[son]=tp;
if(tp->len==1)
tp->last=Node_2,tp->num=1;
else
{
while(true)
{
cur=cur->last;
curlen=cur->len;
if(place-1-curlen>=0&&s[place-1-curlen]==s[place])
{
Max_Node->last=cur->ch[son];
break;
}
}
Max_Node->num=Max_Node->last->num+1;
}
}
return Exit;
}
int main()
{
scanf("%s",s);
int len=strlen(s);
begin();
int ans=0;
for(int i=0;i<len;i++)
add(i),ans+=Max_Node->num;
printf("%d\n",ans);
return 0;
return 0;
}