比赛 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;
}