比赛 NOIP模拟赛by mzx Day2 评测结果 AAWWAAAWWW
题目名称 拯救紫萱学姐 最终得分 50
用户昵称 Rapiz 运行时间 1.569 s
代码语言 C++ 内存使用 52.62 MiB
提交时间 2016-10-20 21:53:26
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<set>
  4. #include<algorithm>
  5. #define file(x) "savemzx."#x
  6. using std::set;
  7. using std::max;
  8. typedef long long ll;
  9. const int MAXN=1000010;
  10. int n,nxt[MAXN],unxt[MAXN];
  11. ll ans,dis[MAXN];
  12. char s[MAXN];
  13. struct EDGE{int u,v;ll w;}st[MAXN<<1];
  14. int hed[MAXN],gnxt[MAXN<<1],sz;
  15. void _add(int u,int v,ll w){
  16. st[++sz].u=u,st[sz].v=v,st[sz].w=w;
  17. gnxt[sz]=hed[u],hed[u]=sz;
  18. }
  19. void add(int u,int v,ll w){
  20. _add(u,v,w);
  21. _add(v,u,w);
  22. }
  23. ll nd;
  24. void dfs(int u,int fa){
  25. dis[u]=nd;
  26. for(int e=hed[u];e;e=gnxt[e]) if(st[e].v!=fa){
  27. nd+=st[e].w;
  28. dfs(st[e].v,u);
  29. nd-=st[e].w;
  30. }
  31. }
  32. int main(){
  33. freopen(file(in),"r",stdin);
  34. freopen(file(out),"w",stdout);
  35. scanf("%s",s+1);
  36. n=strlen(s+1);
  37. for(int i=2;i<=n;i++){
  38. int p=nxt[i-1];
  39. while(p&&s[p+1]!=s[i]) p=nxt[p];
  40. if(s[i]==s[p+1]) p++;
  41. nxt[i]=p;
  42. }
  43. for(int i=n;i;i--){
  44. ll p=nxt[i];
  45. while(p&&p*2>i) {
  46. nxt[i]=p;
  47. p=nxt[p];
  48. }
  49. unxt[i]=p;
  50. add(i,p,(i-p)*(i-p));
  51. }
  52. dfs(1,-1);
  53. int u=1;
  54. for(int i=1;i<=n;i++) if(dis[i]>dis[u]) u=i;
  55. dfs(u,-1);
  56. int v=1;
  57. for(int i=1;i<=n;i++) if(dis[i]>dis[v]) v=i;
  58. printf("%lld",dis[v]);
  59. }