比赛 |
NOIP模拟赛by mzx Day2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
拯救紫萱学姐 |
最终得分 |
100 |
用户昵称 |
前鬼后鬼的守护 |
运行时间 |
0.884 s |
代码语言 |
C++ |
内存使用 |
47.04 MiB |
提交时间 |
2016-10-20 21:48:56 |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#define FILE "savemzx"
const int MAXN(1000005);
int n;
namespace Tree{
typedef long long ll;
struct edge{
int y,next;
ll l;
}e[MAXN<<1];
int head[MAXN],ecnt;
inline void connect(int x,int y,ll l){
//fprintf(stderr,"(%d,%d)%I64d\n",x,y,l);
e[++ecnt]=(edge){y,head[x],l};head[x]=ecnt;
e[++ecnt]=(edge){x,head[y],l};head[y]=ecnt;
}
ll dis[MAXN],ans;
inline void cmax(ll &a,ll b){if(a<b)a=b;}
void DP(int x=0,int p=0){
for(int i=head[x],y;i;i=e[i].next)
if((y=e[i].y)!=p){
DP(y,x);ll l=e[i].l;
cmax(ans,dis[y]+l+dis[x]);
cmax(dis[x],dis[y]+l);
}
}
void Solve(){
DP();
std::cout<<ans;
}
}
namespace String{
char str[MAXN];
int next[MAXN];
void Work(){
scanf("%s",str+1);n=strlen(str+1);
Tree::connect(0,1,1LL);
for(int i=2,j=0;i<=n;i++){
while(j&&str[j+1]!=str[i])
j=next[j];
if(str[j+1]==str[i])
j++;
next[i]=j;
Tree::connect(j,i,1LL*(i-j)*(i-j));
}
}
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
String::Work();
Tree::Solve();
return 0;
}