[后缀自动机 构建后缀树 树形DP] BZOJ 3238 [Ahoi2013]差异
来源:互联网 发布:win10软件不见了 编辑:程序博客网 时间:2024/06/10 09:34
反串的parent树就是后缀树
lcp就是他们的lca的深度 也就是后缀自动机上的maxl
然后树形DP一下就好了
#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++;}inline int read(char *s){ char c=nc(); int len=0; for (;!(c>='a' && c<='z');c=nc()) if (c==EOF) return 0; for (;c>='a' && c<='z';s[++len]=c,c=nc()); s[++len]=0; return len-1;}const int N=500005;struct state{ int len,link,next[26];}st[N<<1];int ncnt,last;int cnt[N<<1];ll f[N<<1],Ans;inline void Extend(char c){ int cur=++ncnt,p; c-='a'; st[cur].len=st[last].len+1; cnt[cur]=1; f[cur]=1; for (p=last;p!=-1 && !st[p].next[c];p=st[p].link) st[p].next[c]=cur; if (p==-1) st[cur].link=0; else{ int q=st[p].next[c]; if (st[q].len==st[p].len+1) st[cur].link=q; else{ int nq=++ncnt; st[nq].len=st[p].len+1; st[nq].link=st[q].link; for (int i=0;i<26;i++) st[nq].next[i]=st[q].next[i]; for (;p!=-1 && st[p].next[c]==q;p=st[p].link) st[p].next[c]=nq; st[q].link=st[cur].link=nq; } } last=cur;}int tmp[N<<1],sum[N<<1];inline void Sort(){ for (int i=0;i<=ncnt;i++) sum[st[i].len]++; for (int i=1;i<=st[last].len;i++) sum[i]+=sum[i-1]; for (int i=ncnt;~i;i--) tmp[sum[st[i].len]--]=i;}char A[N];int n;int main(){ freopen("t.in","r",stdin); freopen("t.out","w",stdout); n=read(A); st[0].link=-1; for (int i=n;i;i--) Extend(A[i]); Sort(); for (int i=ncnt+1;i>1;i--) cnt[st[tmp[i]].link]+=cnt[tmp[i]]; for (int i=ncnt+1;i>1;i--){ int x=tmp[i]; Ans+=(ll)f[st[x].link]*cnt[x]*st[st[x].link].len; f[st[x].link]+=cnt[x]; } printf("%lld\n",(ll)(n+1)*n/2*(n-1)-Ans*2); return 0;}
0 0
- [后缀自动机 构建后缀树 树形DP] BZOJ 3238 [Ahoi2013]差异
- bzoj 3238: [Ahoi2013]差异 (后缀自动机+树形dp)
- [后缀自动机][树形DP] BZOJ 3238: [Ahoi2013]差异
- [BZOJ3238][Ahoi2013][后缀自动机][树形DP]差异
- 【BZOJ 3238】[Ahoi2013]差异 后缀自动机构造后缀树
- BZOJ 3238 AHOI2013 差异 后缀自动机
- bzoj 3238: [Ahoi2013]差异 后缀自动机
- BZOJ 3238 [Ahoi2013]差异 后缀自动机
- bzoj 3238: [Ahoi2013]差异 后缀树
- [Ahoi2013]差异 后缀自动机
- [BZOJ3238][Ahoi2013]差异(后缀数组+单调栈||后缀自动机+树形dp)
- 后缀自动机+DP BZOJ 3238 差异
- 【BZOJ3238】【Ahoi2013】差异 后缀自动机
- [BZOJ3238] [AHOI2013] 差异 - 后缀自动机
- bzoj3238 [Ahoi2013]差异 后缀自动机
- bzoj 3238: [Ahoi2013]差异 后缀数组
- BZOJ 3238: [Ahoi2013]差异 后缀数组
- bzoj 3238 ahoi2013差异 后缀数组
- 字典转换成模型属性代码笔记
- `uvm_component_utils
- 《深入理解java虚拟机》-虚拟机字节码执行引擎
- 太姥山攻略
- fedora 25 安装 官方 jdk1.8 (rpm版)
- [后缀自动机 构建后缀树 树形DP] BZOJ 3238 [Ahoi2013]差异
- Linux Bash定时存档目录中的文件
- 11464 - Even Parity
- Spring表达式语言:SpEL
- 迭代公式代码解决的常见问题
- tcpip的SIGPIPE信号产生原因及程序调试
- [后缀自动机 LCT] BZOJ 2555 SubString
- mac python3 安装
- Simon游戏代码(C语言)