BZOJ 3238 [Ahoi2013]差异
2016-06-16 17:12
357 查看
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=3238
View Code
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=1000010; int n,last=1,cnt=1; int a[maxn][26],mx[maxn],fa[maxn]; int T[maxn],Seq[maxn]; int f[maxn],w[maxn]; char ch[maxn]; void extend(int c){ int p=last,np=last=++cnt; mx[np]=mx[p]+1; f[np]=w[np]=1; while(!a[p][c] && p) a[p][c]=np,p=fa[p]; if(!p) fa[np]=1; else{ int q=a[p][c]; if(mx[q]==mx[p]+1) fa[np]=q; else{ int nq=++cnt;mx[nq]=mx[p]+1; memcpy(a[nq],a[q],sizeof(a[q])); fa[nq]=fa[q]; fa[q]=fa[np]=nq; while(a[p][c]==q) a[p][c]=nq,p=fa[p]; } } } void get_order(){ for(int i=1;i<=cnt;i++) T[mx[i]]++; for(int i=1;i<=n;i++) T[i]+=T[i-1]; for(int i=1;i<=cnt;i++) Seq[T[mx[i]]--]=i; } ll solve(){ ll ans=0; for(int i=cnt;i>=1;i--) f[fa[Seq[i]]]+=f[Seq[i]]; for(int i=cnt;i>=1;i--){ int x=Seq[i]; ans+=(ll)f[x]*w[fa[x]]*mx[fa[x]]; w[fa[x]]+=f[x]; } return ans; } int main(){ #ifndef ONLINE_JUDGE freopen("3238.in","r",stdin); freopen("3238.out","w",stdout); #endif scanf("%s",ch); n=strlen(ch); for(int i=n-1;i>=0;i--) extend(ch[i]-'a'); ll ans=(ll)(1+n)*n*(n-1)/2; get_order(); ans-=solve()*2; printf("%lld",ans); return 0; }
View Code
相关文章推荐
- iOS中使用GCD中的Group管理子线程
- Android 热更新学习记录
- Java MVC框架性能比较
- 百度地图的JS开发API应用
- 选择法排序
- 为什么之前的作业没有写
- 模式识别(Pattern Recognition)学习笔记(三十)--随机森林(Random Forest)
- java操作mongodb时,对象bean和DBObject相互转换的方法
- UIDevice-b
- tomcat服务器的搭建及介绍
- html初学日记2
- JS框架——MVVM模式的Knockout.js
- 4-1 单链表逆转 (20分)
- UIGestureRecognizer与button冲突的处理
- 修改Android 自带输入法(LatinIME)空格键的显示
- ASP.NET的三层架构(DAL,BLL,UI)
- Javascript, 前端类库
- Ionic Js五:单选框操作
- 【Android】Google Multidex使用方法
- 关于Android的.so文件你所需要知道的