比赛 NOIP模拟赛by mzx Day2 评测结果 AAAAAAAAAA
题目名称 拯救紫萱学姐 最终得分 100
用户昵称 FoolMike 运行时间 2.005 s
代码语言 C++ 内存使用 127.14 MiB
提交时间 2016-10-20 21:43:18
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int N=1000010;
  7. typedef long long ll;
  8. char s[N];int n,fa[N];ll up[N];
  9. struct edge{
  10. int f,t;ll l;
  11. edge(int F=0,int T=0,ll L=0){f=F;t=T;l=L;}
  12. }w[5*N];
  13. int cnt[N],head[N],tail[N],next[5*N],sum;
  14. inline void add(int f,int t,ll l){
  15. sum++;w[sum]=edge(f,t,l);
  16. if (!head[f]) head[f]=tail[f]=sum;
  17. else tail[f]=next[tail[f]]=sum;
  18. }
  19. ll dis[N];
  20. queue<int> Q;
  21. void bfs(int s){
  22. for (int i=0;i<=n;i++) dis[i]=1e+14;
  23. fa[s]=s;dis[s]=0;Q.push(s);
  24. while (!Q.empty()){
  25. int v=Q.front();Q.pop();
  26. for (int i=head[v];i;i=next[i])
  27. if (dis[w[i].t]>dis[v]+w[i].l)
  28. dis[w[i].t]=dis[v]+w[i].l,Q.push(w[i].t);
  29. }
  30. }
  31. int main()
  32. {
  33. freopen("savemzx.in","r",stdin);
  34. freopen("savemzx.out","w",stdout);
  35. scanf("%s",s+1);n=strlen(s+1);
  36. fa[1]=0;add(1,0,1);add(0,1,1);
  37. for (int i=2;i<=n;i++){
  38. int j=fa[i-1];
  39. while (j&&s[j+1]!=s[i]) j=fa[j];
  40. fa[i]=(s[j+1]==s[i]?j+1:0);
  41. ll l=(ll)(i-fa[i])*(i-fa[i]);
  42. add(fa[i],i,l);add(i,fa[i],l);
  43. }
  44. bfs(0);int p=0;
  45. for (int i=0;i<=n;i++)
  46. if (dis[i]>dis[p]) p=i;
  47. bfs(p);p=0;
  48. for (int i=0;i<=n;i++)
  49. if (dis[i]>dis[p]) p=i;
  50. printf("%lld\n",dis[p]);
  51. return 0;
  52. }