比赛 NOIP模拟赛by mzx Day2 评测结果 AAAAAAAAAA
题目名称 拯救紫萱学姐 最终得分 100
用户昵称 scpointer 运行时间 1.573 s
代码语言 C++ 内存使用 107.13 MiB
提交时间 2016-10-20 21:40:30
显示代码纯文本
#include <cstdio>
#include <iostream>
#define N 2000005
#define INF 10000000000000000ll
typedef long long ll;
int a[N];
int pre[N];
int cnt;
void init()
{
	char cr;
	while( (cr=getchar())<'a' || cr>'z');
	a[++cnt]=cr-'a'+1;
	while( (cr=getchar())>='a' && cr<='z')
		a[++cnt]=cr-'a'+1;
}
void kmp()
{
	pre[1]=0;
	for(int i=2;i<=cnt;i++)
	{
		int j=pre[i-1];
		while(j && a[j+1]!=a[i]) j=pre[j];
		pre[i]= a[j+1]==a[i]? j+1 :0;	
	}
}

int eg[N<<1],nxt[N<<1],head[N],egtot;
int q[N];
ll len[N<<1],dis[N];
void addEdge(int p1,int p2,ll length)
{
	eg[++egtot]=p2;
	nxt[egtot]=head[p1];
	len[egtot]=length;
	head[p1]=egtot;
}
ll findfurthest(int S,int& res,int nds=cnt+1)
{
	for(int i=1;i<=nds;i++)
		dis[i]=INF;
	dis[S]=0;res=S;
	int l,r,p;q[l=r=1]=S;
	while(l<=r)
	{
		p=q[l++];
		for(int e=head[p];e;e=nxt[e])
			if(dis[eg[e]]>dis[p]+len[e])
			{
				dis[eg[e]]=dis[p]+len[e];
				q[++r]=eg[e];
				if(dis[eg[e]]>dis[res])
					res=eg[e];
			}
	}
	return dis[res];
}
int main()
{
	freopen("savemzx.in","r",stdin);
	freopen("savemzx.out","w",stdout);
	init();
	kmp();
	for(int i=1;i<=cnt;i++)
	{
		addEdge(i+1,pre[i]+1,(ll)(i-pre[i])*(i-pre[i]));
		addEdge(pre[i]+1,i+1,(ll)(i-pre[i])*(i-pre[i]));
	}
	int p1,p2;findfurthest(1,p1);
	std::cout<<findfurthest(p1,p2);
}