比赛 |
NOIP模拟赛by mzx Day2 |
评测结果 |
AAWWAAAWWW |
题目名称 |
拯救紫萱学姐 |
最终得分 |
50 |
用户昵称 |
Rapiz |
运行时间 |
1.569 s |
代码语言 |
C++ |
内存使用 |
52.62 MiB |
提交时间 |
2016-10-20 21:53:26 |
显示代码纯文本
- #include<cstdio>
- #include<cstring>
- #include<set>
- #include<algorithm>
- #define file(x) "savemzx."#x
- using std::set;
- using std::max;
- typedef long long ll;
- const int MAXN=1000010;
- int n,nxt[MAXN],unxt[MAXN];
- ll ans,dis[MAXN];
- char s[MAXN];
- struct EDGE{int u,v;ll w;}st[MAXN<<1];
- int hed[MAXN],gnxt[MAXN<<1],sz;
- void _add(int u,int v,ll w){
- st[++sz].u=u,st[sz].v=v,st[sz].w=w;
- gnxt[sz]=hed[u],hed[u]=sz;
- }
- void add(int u,int v,ll w){
- _add(u,v,w);
- _add(v,u,w);
- }
- ll nd;
- void dfs(int u,int fa){
- dis[u]=nd;
- for(int e=hed[u];e;e=gnxt[e]) if(st[e].v!=fa){
- nd+=st[e].w;
- dfs(st[e].v,u);
- nd-=st[e].w;
- }
- }
- int main(){
- freopen(file(in),"r",stdin);
- freopen(file(out),"w",stdout);
- scanf("%s",s+1);
- n=strlen(s+1);
- for(int i=2;i<=n;i++){
- int p=nxt[i-1];
- while(p&&s[p+1]!=s[i]) p=nxt[p];
- if(s[i]==s[p+1]) p++;
- nxt[i]=p;
- }
- for(int i=n;i;i--){
- ll p=nxt[i];
- while(p&&p*2>i) {
- nxt[i]=p;
- p=nxt[p];
- }
- unxt[i]=p;
- add(i,p,(i-p)*(i-p));
- }
- dfs(1,-1);
- int u=1;
- for(int i=1;i<=n;i++) if(dis[i]>dis[u]) u=i;
- dfs(u,-1);
- int v=1;
- for(int i=1;i<=n;i++) if(dis[i]>dis[v]) v=i;
- printf("%lld",dis[v]);
- }