比赛 NOIP模拟赛by mzx Day2 评测结果 AAAAAAAAAA
题目名称 拯救紫萱学姐 最终得分 100
用户昵称 scpointer 运行时间 1.573 s
代码语言 C++ 内存使用 107.13 MiB
提交时间 2016-10-20 21:40:30
显示代码纯文本
  1. #include <cstdio>
  2. #include <iostream>
  3. #define N 2000005
  4. #define INF 10000000000000000ll
  5. typedef long long ll;
  6. int a[N];
  7. int pre[N];
  8. int cnt;
  9. void init()
  10. {
  11. char cr;
  12. while( (cr=getchar())<'a' || cr>'z');
  13. a[++cnt]=cr-'a'+1;
  14. while( (cr=getchar())>='a' && cr<='z')
  15. a[++cnt]=cr-'a'+1;
  16. }
  17. void kmp()
  18. {
  19. pre[1]=0;
  20. for(int i=2;i<=cnt;i++)
  21. {
  22. int j=pre[i-1];
  23. while(j && a[j+1]!=a[i]) j=pre[j];
  24. pre[i]= a[j+1]==a[i]? j+1 :0;
  25. }
  26. }
  27.  
  28. int eg[N<<1],nxt[N<<1],head[N],egtot;
  29. int q[N];
  30. ll len[N<<1],dis[N];
  31. void addEdge(int p1,int p2,ll length)
  32. {
  33. eg[++egtot]=p2;
  34. nxt[egtot]=head[p1];
  35. len[egtot]=length;
  36. head[p1]=egtot;
  37. }
  38. ll findfurthest(int S,int& res,int nds=cnt+1)
  39. {
  40. for(int i=1;i<=nds;i++)
  41. dis[i]=INF;
  42. dis[S]=0;res=S;
  43. int l,r,p;q[l=r=1]=S;
  44. while(l<=r)
  45. {
  46. p=q[l++];
  47. for(int e=head[p];e;e=nxt[e])
  48. if(dis[eg[e]]>dis[p]+len[e])
  49. {
  50. dis[eg[e]]=dis[p]+len[e];
  51. q[++r]=eg[e];
  52. if(dis[eg[e]]>dis[res])
  53. res=eg[e];
  54. }
  55. }
  56. return dis[res];
  57. }
  58. int main()
  59. {
  60. freopen("savemzx.in","r",stdin);
  61. freopen("savemzx.out","w",stdout);
  62. init();
  63. kmp();
  64. for(int i=1;i<=cnt;i++)
  65. {
  66. addEdge(i+1,pre[i]+1,(ll)(i-pre[i])*(i-pre[i]));
  67. addEdge(pre[i]+1,i+1,(ll)(i-pre[i])*(i-pre[i]));
  68. }
  69. int p1,p2;findfurthest(1,p1);
  70. std::cout<<findfurthest(p1,p2);
  71. }