记录编号 326331 评测结果 AAAAAAAAAA
题目名称 拯救紫萱学姐 最终得分 100
用户昵称 Gravatar_Itachi 是否通过 通过
代码语言 C++ 运行时间 1.442 s
提交时间 2016-10-21 07:24:26 内存使用 15.26 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <queue>
using namespace std;
int _read(){int ret,neg;char ch;ret=neg=0;while(!isdigit(ch=getchar())&&ch!='-');if(ch=='-')neg=1,ch=getchar();while(ret=ret*10+ch-'0',isdigit(ch=getchar()));if(neg)ret=-ret;return ret;}
const int maxn=1000005;
#define LL long long
char s[maxn];int n,head[maxn],len=1,next[maxn],vis[maxn],tim=0;LL dis[maxn];
struct _tree{int to,next;LL dis;}e[maxn<<1];
void _set(int prt,int son){
	e[++len].to=son,e[len].next=head[prt],head[prt]=len,
	e[len].dis=(LL)(son-prt)*(son-prt);
}
void _KMP(){
	n=strlen(s+1);int i,j=0;next[1]=0;
	for(i=2;i<=n;i++){
		while(j&&s[i]^s[j+1])j=next[j];
		if(s[i]==s[j+1])j++;
		next[i]=j;	
	}
	for(i=1;i<=n;i++)_set(next[i],i),_set(i,next[i]);
	//printf("%d ",next[i]);putchar('\n');
}
#define to e[i].to
queue<int>q;
void _run(int s){
//	for(int i=head[rt];i;i=e[i].next)
//		if(vis[to]^tim)vis[to]=tim,dis[to]=dis[rt]+e[i].dis,_run(to);
	while(!q.empty())q.pop();q.push(s);int rt,i;
	while(!q.empty()){
		rt=q.front(),q.pop();
		for(i=head[rt];i;i=e[i].next)
			if(vis[to]^tim)
				vis[to]=tim,dis[to]=(LL)dis[rt]+e[i].dis,q.push(to);
	}
}
void _work(){
	scanf("%s",s+1);_KMP();
	dis[1]=0,vis[1]=++tim;_run(1);int RT=0,i;LL ma=0;
	for(i=0;i<=n;i++)if(dis[i]>ma)ma=dis[i],RT=i;
	dis[RT]=0,vis[RT]=++tim;_run(RT);ma=0;
	for(i=0;i<=n;i++)if(dis[i]>ma)ma=dis[i];
	printf("%lld\n",ma);
}
bool _Rabit(),_RABIT=_Rabit();int main(){;}
bool _Rabit(){
#define _Rabit _RABIT
#ifdef _Rabit
	freopen("savemzx.in","r",stdin);
	freopen("savemzx.out","w",stdout);
#endif
	_work();
#ifndef _Rabit
	getchar(),getchar();
#endif
	fclose(stdin);fclose(stdout);
}