比赛 NOIP模拟赛by mzx Day2 评测结果 AAWWAAAAAA
题目名称 拯救紫萱学姐 最终得分 80
用户昵称 派特三石 运行时间 1.462 s
代码语言 C++ 内存使用 46.14 MiB
提交时间 2016-10-20 21:33:23
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #define pa system("pause")
  6. using namespace std;
  7. const int maxn=1001000;
  8. typedef long long LL;
  9. string s,ss;
  10. struct edge
  11. {
  12. int from,to,next;LL dis;
  13. }e[maxn<<1];
  14. int n,m,len,head[maxn],tot,ans,f[maxn],Time;LL temp,ma;
  15. void insert(int x,int y,LL z)
  16. {
  17. e[++len].from=x;e[len].to=y;e[len].dis=z;e[len].next=head[x];head[x]=len;
  18. }
  19. void MP()
  20. {
  21. f[0]=f[1]=0;
  22. int len=s.size();
  23. for(int i=1;i<len;++i)
  24. {
  25. int j=f[i];
  26. while(j&&s[i]!=s[j])j=f[j];
  27. if(s[i]==s[j])f[i+1]=j+1;
  28. else f[i+1]=0;
  29. }
  30. for(int i=1;i<=len;++i)
  31. {
  32. insert(i,f[i],(LL)(i-f[i])*(i-f[i]));
  33. insert(f[i],i,(LL)(i-f[i])*(i-f[i]));
  34. }
  35. }
  36. void dfs(int x,LL tot)
  37. {
  38. f[x]=Time;
  39. for(int i=head[x];i;i=e[i].next)
  40. {
  41. int k=e[i].to;
  42. if(f[k]==Time)continue;
  43. if(tot+e[i].dis>ma)
  44. {
  45. ma=tot+e[i].dis;
  46. temp=k;
  47. }
  48. f[k]=Time;
  49. dfs(k,tot+e[i].dis);
  50. }
  51. }
  52. int main()
  53. {
  54. freopen("savemzx.in","r",stdin);
  55. freopen("savemzx.out","w",stdout);
  56. cin>>s;
  57. MP();Time++;
  58. dfs(0,0);Time++;
  59. dfs(temp,0);
  60. printf("%lld\n",ma);
  61. }