一些神奇的东西
一、对一棵树求一个排列, 满足排列的每相邻两个数在这棵树上对应的节点距离不超过3,所有边权均为1
其实yy一会儿可能会有一些想法,但是难写啊!
有一种非常神奇的写法,描述一下是这个样子的
对深度为奇数的点先序遍历,对深度为偶数的点后序遍历
也许正确性没那么显然,但是我们手玩手玩就发现是对的了
大概这么写就行了
void dfs(int now,int typ)
{
if(typ) s[++tot]=now;
for(int i=head[now];i;i=Next[i])
if(to[v]!=f[now])
dfs(v,typ^1);
if(typ^1) s[++tot]=now;
}
二、一个长为\(n\)的01串有多少种不同的子序列?一个长为\(n\)的字符集大小为\(S\)的串有多少种不同的子序列?
一般的,我们可以在\(O(2^SN)\)的时间内解决这个问题
具体做法可以先看看这个具体问题 喵QAQ
UPDATA:求本质不同的子序列有更优秀的做法,甚至可以区间查询
咕咕咕