记录编号 326296 评测结果 AAAAAAAAAA
题目名称 拯救紫萱学姐 最终得分 100
用户昵称 GravatarHzoi_Yniverse 是否通过 通过
代码语言 C++ 运行时间 1.760 s
提交时间 2016-10-21 07:16:51 内存使用 50.61 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const long long maxn=1000010;
  7. char s[maxn]; bool vis[maxn];
  8. long long next[maxn],head[maxn],n,ans,k,len;
  9. struct Edge{ long long to,next,dis; }e[maxn*2];
  10. void Insert(long long x,long long y,long long z){
  11. len++;
  12. e[len].to=y; e[len].dis=z;
  13. e[len].next=head[x]; head[x]=len;
  14. }
  15. void GetNext(){
  16. next[1]=next[0]=0;
  17. long long j=0;
  18. for(long long i=1;i<n;i++){
  19. while(j&&s[i]!=s[j]) j=next[j];
  20. if(s[i]==s[j]) j++;
  21. next[i+1]=j;
  22. }
  23. }
  24. void Build(){
  25. for(long long i=1;i<=n;i++){
  26. long long z=(i-next[i])*(i-next[i]);
  27. Insert(i,next[i],z);
  28. Insert(next[i],i,z);
  29. //printf("i== next==%lld\n",i,next[i]);
  30. }
  31. }
  32. void Dfs(long long x,long long dis){
  33. //printf("x==%lld dis==%lld\n",x,dis); getchar();
  34. if(ans<=dis){ ans=dis; k=x; }
  35. for(long long i=head[x];i;i=e[i].next){
  36. long long j=e[i].to;
  37. if(!vis[j]){//printf("x==%lld j=%lld\n",x,j);
  38. vis[j]=1; Dfs(j,dis+e[i].dis);
  39. }
  40. }
  41. }
  42. int main(){
  43. freopen("savemzx.in","r",stdin);
  44. freopen("savemzx.out","w",stdout);
  45. long long __size__=128<<20;
  46. char *__p__=(char*)malloc(__size__)+__size__;
  47. __asm__("movl %0, %%esp\n"::"r"(__p__));
  48. scanf("%s",s); n=strlen(s);
  49. GetNext();
  50. Build();
  51. vis[0]=1; Dfs(0,0);
  52. memset(vis,0,sizeof(vis)); ans=0; //printf("k==%lld\n",k);
  53. vis[k]=1; Dfs(k,0);
  54. printf("%lld\n",ans);
  55. //while(1);
  56. return 0;
  57. }