博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3926
阅读量:5273 次
发布时间:2019-06-14

本文共 1997 字,大约阅读时间需要 6 分钟。

bzoj 3926

trie树后缀自动机,直接用val值统计答案

注意细节,p,q不要打反;注意删调

 

#include
#include
#include
#include
using namespace std;#define maxn 2000020#define maxm 100020struct node{ int next[12];}trie[maxn];struct node1{ int next[12],val,pnt;}sam[maxn * 2];struct node2{ int to,next;}e[maxm * 2];int tot,cnt,head[maxm],root;long long sum;int n,col[maxm],c,degree[maxm],last;inline void addedge(int x,int y){ e[++cnt].to = y; e[cnt].next = head[x]; head[x] = cnt; degree[x]++;}inline int add_sam(int x,int last){ int np = ++tot; int p = last; sam[np].val = sam[p].val + 1; while ( p && !sam[p].next[x] ){ sam[p].next[x] = np , p = sam[p].pnt; } int q = sam[p].next[x]; if ( !q ){ sam[p].next[x] = np; sam[np].pnt = p; } else if ( q && sam[p].val + 1 == sam[q].val ){ sam[np].pnt = q; } else{ int nq = ++tot; sam[nq].pnt = sam[q].pnt; sam[np].pnt = sam[q].pnt = nq; sam[nq].val = sam[p].val + 1; memcpy(sam[nq].next,sam[q].next,sizeof(sam[q].next)); while ( p && sam[p].next[x] == q ){ sam[p].next[x] = nq , p = sam[p].pnt; } if ( sam[p].next[x] == q ) sam[p].next[x] = nq; } return np;}void dfs_trie(int now,int last){ int cur = last; for (int i = 0 ; i <= c; i++){ if ( trie[now].next[i] ){ last = add_sam(i,cur); dfs_trie(trie[now].next[i],last); } }}void dfs(int now,int &trie_now,int fa){ if ( !trie_now ) trie_now = ++tot; for (int i = head[now] ; i ; i = e[i].next){ if ( fa == e[i].to ) continue; dfs(e[i].to,trie[trie_now].next[col[e[i].to]],now); } }int main(){ scanf("%d %d",&n,&c); for (int i = 1 ; i <= n ; i++) scanf("%d",&col[i]); for (int i = 1 ; i < n ; i++){ int u,v; scanf("%d %d",&u,&v); addedge(u,v); addedge(v,u); } for (int i = 1 ; i <= n ; i++){ if ( degree[i] == 1 ){ dfs(i,trie[0].next[col[i]],0); } } tot = 0; dfs_trie(0,root); for (int i = 1 ; i <= tot ; i++){ sum += (long long) sam[i].val - (long long) sam[sam[i].pnt].val; } printf("%lld",sum); return 0;}

  

 

转载于:https://www.cnblogs.com/zqq123/p/5119721.html

你可能感兴趣的文章
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
composer 报 zlib_decode(): data error
查看>>
hdu 3938 并查集
查看>>