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

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

求不同的子串个数

如果规定根的话,那么弯曲的路径难以处理。

由于只有20个叶子,所以以每个叶子分别为根,建20棵trie树,再把20棵trie树合成一棵。

这样,trie上一个到某个祖先的路径构成了所有的子串。(可能重复)

所以trie上建SAM。SAM的路径条数(或者每个点的len[i]-len[fa[i]])就是本质不同的子串个数

 

至于trie上建SAM,可以dfs,或者bfs建。

只要记录树上x的father的SAM上的节点编号p,从这个p作为nd开始建即可。

#include
#define il inline#define reg register int#define numb (ch^'0')using namespace std;typedef long long ll;il void rd(int &x){ char ch;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=100000+5;int n,m;int clo[N];int du[N];struct node{ int nxt,to;}e[2*N];int hd[N],cnt;void add(int x,int y){ e[++cnt].nxt=hd[x]; e[cnt].to=y; hd[x]=cnt;}struct trie{ int cnt,ch[20*N][10]; trie(){ cnt=1; }}tr;void dfs(int x,int y,int fa){ if(!tr.ch[y][clo[x]]){ tr.ch[y][clo[x]]=++tr.cnt; } y=tr.ch[y][clo[x]]; for(reg i=hd[x];i;i=e[i].nxt){ int z=e[i].to; if(z==fa) continue; dfs(z,y,x); }}struct SAM{ int fa[20*N],len[20*N],ch[20*N][10],cnt; ll s[20*N]; SAM(){ cnt=1; } int ins(int c,int p){ //cout<<" c p "<
<<" "<

<

1

其实不用建出合并的trie。

直接在20次dfs的时候(每次dfs都是一个小trie),20次每次从根开始插入即可。

重复的前缀部分会和根节点隔离开的。既不会能从根节点到达,而且fa[i]=len[i],没有包含一个子串。

#include
#define il inline#define reg register int#define numb (ch^'0')using namespace std;typedef long long ll;il void rd(int &x){ char ch;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=100010;#define TOT 2000000struct node{ int nxt,to;}e[2*N];int hd[N],cnt;int n,m;int clo[N];void add(int x,int y){ e[++cnt].nxt=hd[x]; e[cnt].to=y; hd[x]=cnt;}struct SAM{ int fa[TOT],len[TOT],ch[TOT][10],cnt; ll s[TOT]; SAM(){ cnt=1; } int ins(int c,int p){ //cout<<" c p "<
<<" "<

<

2

 

(当然,如果广义SAM要处理Right集合的大小的话,要根据建造的方法处理

1.所有的串依次从rt=1开始插入

叶子sz赋值为1,然后Parent树上往上push。注意,不管节点是否有实际意义,都要push上去。因为代表一个出现的位置

2.trie树

先要找到trie树某个点的sz[x],然后插入的时候sz就是这个sz[x]

 

转载于:https://www.cnblogs.com/Miracevin/p/10109139.html

你可能感兴趣的文章
自动化运维之kickstart自动化部署安装操作系统
查看>>
C++前置声明的一个好处与用法
查看>>
Upgrade GI/CRS 11.1.0.7 to 11.2.0.2. Rootupgrade.sh Hanging
查看>>
vue组件样式scoped
查看>>
整站爬虫命令
查看>>
linux下ssh/sftp配置和权限设置
查看>>
微软职位内部推荐-SDE II
查看>>
SQLPlus获取oracle表操作SQL
查看>>
BFS(两点搜索) UVA 11624 Fire!
查看>>
字符串处理 BestCoder Round #43 1001 pog loves szh I
查看>>
How to add svn:externals in windows using TortoiseSVN
查看>>
JavaScript高级程序设计(5) 引用类型 (上)
查看>>
QT学习-10/31/2012
查看>>
python学习交流 - 匿名函数
查看>>
文章1(转)
查看>>
schedule调用相关整理
查看>>
node.js-session问题
查看>>
拦截器和过滤器的区别 -- 简单分析篇
查看>>
Python版本微信跳一跳,软件配置
查看>>
PropertyGrid仿VS的属性事件窗口
查看>>