比赛 NOIP模拟赛by mzx Day2 评测结果 AAWWAAAWWW
题目名称 拯救紫萱学姐 最终得分 50
用户昵称 Rapiz 运行时间 1.569 s
代码语言 C++ 内存使用 52.62 MiB
提交时间 2016-10-20 21:53:26
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#define file(x) "savemzx."#x
using std::set;
using std::max;
typedef long long ll;
const int MAXN=1000010;
int n,nxt[MAXN],unxt[MAXN];
ll ans,dis[MAXN];
char s[MAXN];
struct EDGE{int u,v;ll w;}st[MAXN<<1];
int hed[MAXN],gnxt[MAXN<<1],sz;
void _add(int u,int v,ll w){
	st[++sz].u=u,st[sz].v=v,st[sz].w=w;
	gnxt[sz]=hed[u],hed[u]=sz;
}
void add(int u,int v,ll w){
	_add(u,v,w);
	_add(v,u,w);
}
ll nd;
void dfs(int u,int fa){
	dis[u]=nd;
	for(int e=hed[u];e;e=gnxt[e]) if(st[e].v!=fa){
		nd+=st[e].w;
		dfs(st[e].v,u);
		nd-=st[e].w;
	}
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int i=2;i<=n;i++){
		int p=nxt[i-1];
		while(p&&s[p+1]!=s[i]) p=nxt[p];
		if(s[i]==s[p+1]) p++;
		nxt[i]=p;
	}
	for(int i=n;i;i--){
		ll p=nxt[i];
		while(p&&p*2>i) {
			nxt[i]=p; 
			p=nxt[p];
		} 
		unxt[i]=p;
		add(i,p,(i-p)*(i-p));
	}
	dfs(1,-1);
	int u=1;
	for(int i=1;i<=n;i++) if(dis[i]>dis[u]) u=i;
	dfs(u,-1);
	int v=1;
	for(int i=1;i<=n;i++) if(dis[i]>dis[v]) v=i;
	printf("%lld",dis[v]);
}