比赛 |
NOIP模拟赛by mzx Day2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
拯救紫萱学姐 |
最终得分 |
100 |
用户昵称 |
scpointer |
运行时间 |
1.573 s |
代码语言 |
C++ |
内存使用 |
107.13 MiB |
提交时间 |
2016-10-20 21:40:30 |
显示代码纯文本
- #include <cstdio>
- #include <iostream>
- #define N 2000005
- #define INF 10000000000000000ll
- typedef long long ll;
- int a[N];
- int pre[N];
- int cnt;
- void init()
- {
- char cr;
- while( (cr=getchar())<'a' || cr>'z');
- a[++cnt]=cr-'a'+1;
- while( (cr=getchar())>='a' && cr<='z')
- a[++cnt]=cr-'a'+1;
- }
- void kmp()
- {
- pre[1]=0;
- for(int i=2;i<=cnt;i++)
- {
- int j=pre[i-1];
- while(j && a[j+1]!=a[i]) j=pre[j];
- pre[i]= a[j+1]==a[i]? j+1 :0;
- }
- }
-
- int eg[N<<1],nxt[N<<1],head[N],egtot;
- int q[N];
- ll len[N<<1],dis[N];
- void addEdge(int p1,int p2,ll length)
- {
- eg[++egtot]=p2;
- nxt[egtot]=head[p1];
- len[egtot]=length;
- head[p1]=egtot;
- }
- ll findfurthest(int S,int& res,int nds=cnt+1)
- {
- for(int i=1;i<=nds;i++)
- dis[i]=INF;
- dis[S]=0;res=S;
- int l,r,p;q[l=r=1]=S;
- while(l<=r)
- {
- p=q[l++];
- for(int e=head[p];e;e=nxt[e])
- if(dis[eg[e]]>dis[p]+len[e])
- {
- dis[eg[e]]=dis[p]+len[e];
- q[++r]=eg[e];
- if(dis[eg[e]]>dis[res])
- res=eg[e];
- }
- }
- return dis[res];
- }
- int main()
- {
- freopen("savemzx.in","r",stdin);
- freopen("savemzx.out","w",stdout);
- init();
- kmp();
- for(int i=1;i<=cnt;i++)
- {
- addEdge(i+1,pre[i]+1,(ll)(i-pre[i])*(i-pre[i]));
- addEdge(pre[i]+1,i+1,(ll)(i-pre[i])*(i-pre[i]));
- }
- int p1,p2;findfurthest(1,p1);
- std::cout<<findfurthest(p1,p2);
- }