bzoj3926[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
2017-07-23 17:26
337 查看
广义后缀自动机裸题,具体可以参考15年国家队论文。
其实就是在trie上建SAM,一边dfs一边建就可以了。
其实就是在trie上建SAM,一边dfs一边建就可以了。
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=5e5+5; typedef long long ll; int cnt,tot,n,m,l[N*10],head ,col ,d ; int go[N*2],next[N*2],ch[N*10][15],fa[N*10]; inline void add(int x,int y) { go[++cnt]=y; next[cnt]=head[x]; head[x]=cnt; } int ins(int p,int x) { int np,q,nq; np=++cnt;l[np]=l[p]+1; for (;!ch[p][x]&&p;p=fa[p]) ch[p][x]=np; if (!p) fa[np]=1; else { q=ch[p][x]; if (l[q]==l[p]+1) fa[np]=q; else { nq=++cnt;l[nq]=l[p]+1; memcpy(ch[nq],ch[q],sizeof(ch[q])); fa[nq]=fa[q]; fa[q]=fa[np]=nq; for (;ch[p][x]==q;p=fa[p]) ch[p][x]=nq; } } return np; } inline void dfs(int x,int fa,int p) { int t=ins(p,col[x]); for(int i=head[x];i;i=next[i]) { int v=go[i]; if (v!=fa) dfs(v,x,t); } } int main() { scanf("%d%d",&n,&m); fo(i,1,n)scanf("%d",&col[i]); fo(i,1,n-1) { int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); d[x]++,d[y]++; } cnt=1; fo(i,1,n)if (d[i]==1)dfs(i,0,1); ll ans=0; fo(i,1,cnt)ans+=l[i]-l[fa[i]]; printf("%lld\n",ans); return 0; }
相关文章推荐
- [BZOJ3926][ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
- 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
- [广义后缀自动机 Trie树] BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
- BZOJ 3926 && ZJOI 2015 诸神眷顾的幻想乡 (广义后缀自动机)
- 【BZOJ3926】诸神眷顾的幻想乡(ZJOI2015)-广义后缀自动机
- 【BZOJ3926】【Zjoi2015】诸神眷顾的幻想乡 广义后缀自动机
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]
- BZOJ.3926.[ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
- [BZOJ]3926 [ZJOI2015] 诸神眷顾的幻想乡 广义后缀自动机
- BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡 ——广义后缀自动机
- 字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
- bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
- [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
- 【bzoj3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
- bzoj3926 [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
- [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡-后缀自动机
- bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡 后缀自动机
- [BZOJ3926]ZJOI2015诸神眷顾的幻想乡|后缀自动机
- 【BZOJ3926】【Zjoi2015】诸神眷顾的幻想乡 后缀自动机
- [BZOJ3926] [ZJOI2015]诸神眷顾的幻想乡|后缀自动机