记录编号 |
326661 |
评测结果 |
AAAAAAAAAA |
题目名称 |
拯救紫萱学姐 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.300 s |
提交时间 |
2016-10-21 12:11:08 |
内存使用 |
127.14 MiB |
显示代码纯文本
#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;
}