比赛 |
NOIP模拟赛by mzx Day2 |
评测结果 |
AAAAAAAAAA |
题目名称 |
拯救紫萱学姐 |
最终得分 |
100 |
用户昵称 |
FoolMike |
运行时间 |
2.005 s |
代码语言 |
C++ |
内存使用 |
127.14 MiB |
提交时间 |
2016-10-20 21:43:18 |
显示代码纯文本
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<queue>
- using namespace std;
- const int N=1000010;
- typedef long long ll;
- char s[N];int n,fa[N];ll up[N];
- struct edge{
- int f,t;ll l;
- edge(int F=0,int T=0,ll L=0){f=F;t=T;l=L;}
- }w[5*N];
- int cnt[N],head[N],tail[N],next[5*N],sum;
- inline void add(int f,int t,ll l){
- sum++;w[sum]=edge(f,t,l);
- if (!head[f]) head[f]=tail[f]=sum;
- else tail[f]=next[tail[f]]=sum;
- }
- ll dis[N];
- queue<int> Q;
- void bfs(int s){
- for (int i=0;i<=n;i++) dis[i]=1e+14;
- fa[s]=s;dis[s]=0;Q.push(s);
- while (!Q.empty()){
- int v=Q.front();Q.pop();
- for (int i=head[v];i;i=next[i])
- if (dis[w[i].t]>dis[v]+w[i].l)
- dis[w[i].t]=dis[v]+w[i].l,Q.push(w[i].t);
- }
- }
- int main()
- {
- freopen("savemzx.in","r",stdin);
- freopen("savemzx.out","w",stdout);
- scanf("%s",s+1);n=strlen(s+1);
- fa[1]=0;add(1,0,1);add(0,1,1);
- for (int i=2;i<=n;i++){
- int j=fa[i-1];
- while (j&&s[j+1]!=s[i]) j=fa[j];
- fa[i]=(s[j+1]==s[i]?j+1:0);
- ll l=(ll)(i-fa[i])*(i-fa[i]);
- add(fa[i],i,l);add(i,fa[i],l);
- }
- bfs(0);int p=0;
- for (int i=0;i<=n;i++)
- if (dis[i]>dis[p]) p=i;
- bfs(p);p=0;
- for (int i=0;i<=n;i++)
- if (dis[i]>dis[p]) p=i;
- printf("%lld\n",dis[p]);
- return 0;
- }