[Ahoi2013]差异 bzoj 3238 后缀自动机
2018-02-01 20:28
459 查看
题目
分析
后缀自动机模板后缀自动机真是个强大的数据结构
大佬的链接——后缀自动机
code
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define N 500005 #define LL long long using namespace std; int n; int len[N*2]; int ch[N*2][30],fail[N*2]; int f[N*2],w[N*2],b[N*2],c[N*2]; int last,root,cnt; char s ; void ins(int x) { int p,q,np,nq; p=last; last=np=++cnt; len[np]=len[p]+1; w[np]=f[np]=1; for (;!ch[p][x]&&p;p=fail[p]) ch[p][x]=np; if (p==0) fail[np]=root; else { q=ch[p][x]; if (len[q]==(len[p]+1)) fail[np]=q; else { nq=++cnt; len[nq]=len[p]+1; for (int i=0;i<=26;i++) ch[nq][i]=ch[q][i]; fail[nq]=fail[q]; fail[q]=fail[np]=nq; for (;ch[p][x]==q;p=fail[p]) ch[p][x]=nq; } } } LL solve() { for (int i=1;i<=cnt;i++) b[len[i]]++; for (int i=1;i<=n;i++) b[i]+=b[i-1]; for (int i=1;i<=cnt;i++) c[b[len[i]]--]=i; for (int i=cnt;i>=1;i--) f[fail[c[i]]]+=f[c[i]]; LL ans=0; for (int i=1;i<=cnt;i++) { ans+=(LL)w[fail[i]]*f[i]*len[fail[i]]; w[fail[i]]+=f[i]; } return ans; } int main() { scanf("%s",s+1); n=strlen(s+1); last=cnt=root=1; for (int i=1;i<=n;i++) ins(s[i]-'a'); LL ans=0; for (int i=1;i<=n;i++) ans+=(LL)i*(n-1); printf("%lld",ans-solve()*2); return 0; }
相关文章推荐
- [BZOJ3238] [AHOI2013] 差异 - 后缀自动机
- [BZOJ3238][Ahoi2013]差异(后缀数组+单调栈||后缀自动机+树形dp)
- BZOJ_3238_[Ahoi2013]差异_后缀自动机
- [BZOJ3238][Ahoi2013]差异(后缀自动机||后缀数组)
- 【BZOJ 3238】[Ahoi2013]差异 后缀自动机构造后缀树
- BZOJ 3238 AHOI2013 差异 后缀自动机
- BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
- 【BZOJ3238】【Ahoi2013】差异 后缀自动机
- [后缀自动机 构建后缀树 树形DP] BZOJ 3238 [Ahoi2013]差异
- bzoj3238 [Ahoi2013]差异 后缀自动机
- [后缀自动机][树形DP] BZOJ 3238: [Ahoi2013]差异
- [bzoj3238][Ahoi2013]差异——后缀自动机
- [BZOJ3238][Ahoi2013]差异(后缀自动机)
- BZOJ.3238.[AHOI2013]差异(后缀自动机 树形DP or 后缀数组 单调栈)
- BZOJ3238: [Ahoi2013]差异 (后缀自动机)
- BZOJ 3238 [Ahoi2013]差异 ——后缀自动机
- [BZOJ3238][Ahoi2013][后缀自动机][树形DP]差异
- BZOJ 3238: [Ahoi2013]差异 后缀自动机 树形dp
- BZOJ 3238 [Ahoi2013]差异(后缀自动机)
- BZOJ 3238 [Ahoi2013]差异 后缀自动机