博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZJOI2015]诸神眷顾的幻想乡
阅读量:5747 次
发布时间:2019-06-18

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

OJ题号:

BZOJ3926、洛谷3346

题目大意:

  给定一棵带权树,定义两个路径是不同的当且仅当两个路径上的权值构成的串不同,求本质不同的路径个数。

思路:

  广义后缀自动机。
  从每个叶子结点开始DFS,并依次加入到SAM中,对于每个加入的结点,last状态是其父亲节点所在的状态,其余插入过程与普通SAM类似。
  每个叶子结点的last状态为root。
  询问过程与普通SAM完全相同。

1 #include
2 #include
3 #include
4 #include
5 inline int getint() { 6 char ch; 7 while(!isdigit(ch=getchar())); 8 int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');10 return x;11 }12 const int V=100001;13 std::vector
e[V];14 int deg[V];15 inline void add_edge(const int u,const int v) {16 e[u].push_back(v);17 deg[u]++;18 }19 int col[V];20 class GeneralSuffixAutomaton {21 private:22 static const int SIGMA_SIZE=10,MAX_STATE=V<<5;23 struct State {24 int link,go[SIGMA_SIZE],len;25 };26 State s[MAX_STATE];27 int sz,newState(const int l) {28 sz++;29 s[sz].len=l;30 return sz;31 }32 int extend(int p,const int w) {33 int new_p=newState(s[p].len+1);34 while(p&&!s[p].go[w]) {35 s[p].go[w]=new_p;36 p=s[p].link;37 }38 if(!p) {39 s[new_p].link=root;40 } else {41 int q=s[p].go[w];42 if(s[q].len==s[p].len+1) {43 s[new_p].link=q;44 } else {45 int new_q=newState(s[p].len+1);46 memcpy(s[new_q].go,s[q].go,sizeof s[q].go);47 s[new_q].link=s[q].link;48 s[q].link=s[new_p].link=new_q;49 while(p&&s[p].go[w]==q) {50 s[p].go[w]=new_q;51 p=s[p].link;52 }53 }54 }55 return new_p;56 }57 public:58 int root;59 GeneralSuffixAutomaton() {60 root=newState(0);61 }62 void build(const int x,const int par,const int lastptr) {63 int p=extend(lastptr,col[x]);64 for(unsigned i=0;i

 

转载于:https://www.cnblogs.com/skylee03/p/7521017.html

你可能感兴趣的文章
我的友情链接
查看>>
How to automatically enroll user and computer certificate in AD
查看>>
openstack G版 修改vm的flavor级别
查看>>
shared pool分析之结构
查看>>
我的友情链接
查看>>
FastDFS+Nginx多硬盘的配置
查看>>
中间表模式接口,基础数据同步
查看>>
python
查看>>
linux打包与解压问题集锦
查看>>
Linux 虚拟web相关
查看>>
UIPickerView的自定义视图
查看>>
Flash pixel Bender学习笔记
查看>>
apache2.4配置多个端口对应多个目录
查看>>
vue-router
查看>>
雷林鹏分享:codeigniter框架文件上传处理
查看>>
数据库连接
查看>>
Android开发学习——自定义View
查看>>
JQ使用Append添加html文本后再删除该html文本
查看>>
B/S与C/S结构的区别
查看>>
MathType中常见的两种符号的运用
查看>>