比赛 NOIP模拟赛by mzx Day2 评测结果 AAAAAAAAAA
题目名称 拯救紫萱学姐 最终得分 100
用户昵称 FoolMike 运行时间 2.005 s
代码语言 C++ 内存使用 127.14 MiB
提交时间 2016-10-20 21:43:18
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1000010;
typedef long long ll;
char s[N];int n,fa[N];ll up[N];
struct edge{
	int f,t;ll l;
	edge(int F=0,int T=0,ll L=0){f=F;t=T;l=L;}
}w[5*N];
int cnt[N],head[N],tail[N],next[5*N],sum;
inline void add(int f,int t,ll l){
	sum++;w[sum]=edge(f,t,l);
	if (!head[f]) head[f]=tail[f]=sum;
		else tail[f]=next[tail[f]]=sum;
}
ll dis[N];
queue<int> Q;
void bfs(int s){
	for (int i=0;i<=n;i++) dis[i]=1e+14;
	fa[s]=s;dis[s]=0;Q.push(s);
	while (!Q.empty()){
		int v=Q.front();Q.pop();
		for (int i=head[v];i;i=next[i])
		if (dis[w[i].t]>dis[v]+w[i].l)
			dis[w[i].t]=dis[v]+w[i].l,Q.push(w[i].t);
	}
}
int main()
{
	freopen("savemzx.in","r",stdin);
	freopen("savemzx.out","w",stdout);
	scanf("%s",s+1);n=strlen(s+1);
	fa[1]=0;add(1,0,1);add(0,1,1);
	for (int i=2;i<=n;i++){
		int j=fa[i-1];
		while (j&&s[j+1]!=s[i]) j=fa[j];
		fa[i]=(s[j+1]==s[i]?j+1:0);
		ll l=(ll)(i-fa[i])*(i-fa[i]);
		add(fa[i],i,l);add(i,fa[i],l);
	}
	bfs(0);int p=0;
	for (int i=0;i<=n;i++)
	if (dis[i]>dis[p]) p=i;
	bfs(p);p=0;
	for (int i=0;i<=n;i++)
	if (dis[i]>dis[p]) p=i;
	printf("%lld\n",dis[p]);
	return 0;
}