首页 > 其他分享 >树形 DNA

树形 DNA

时间:2024-08-28 20:05:01浏览次数:4  
标签:DNA cur int len 20 树形 n1 300005

  • 由于左右子树不等价,我们可以以Trie树的视角考察原树,发现“叶子节点不超过20个”的条件等价于这棵Trie树可以用不超过20个01字符串表示
  • 树的匹配不好做,但字符串匹配是可做的。于是我们可以想到把树的匹配“折叠”成20个字符串的匹配
  • 猜想时间复杂度是O(20n),其中20是枚举的复杂度
  • 把字符串放入dfs的参数中会导致奇怪的问题
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int P=131;
int l[2][300005],r[2][300005],f[300005][20];
int t[25];
unsigned long long h[25],p[300005],val;
unsigned long long cur[300005];
int cnt[300005];
vector<int>ans;
int n,tot;
void pre()
{
	for(int j=1;j<=18;j++)
	{
		for(int i=1;i<=n;i++)
		{
			if(f[i][j-1]!=-1)
			{
				f[i][j]=f[f[i][j-1]][j-1];
			}
			else
			{
				f[i][j]=-1;
			}
		}
	}
}
void dfs1(int n1,int len)
{
	if(!l[1][n1]&&!r[1][n1])
	{
		tot++;
		t[tot]=len;
		h[tot]=val;
		return;
	}
	if(l[1][n1])
	{
		unsigned long long tmp=val;
		val=val*P+1;
		dfs1(l[1][n1],len+1);
		val=tmp;
	}
	if(r[1][n1])
	{
		unsigned long long tmp=val;
		val=val*P+2;
		dfs1(r[1][n1],len+1);
		val=tmp;
	}
}
int get(int n1,int k)
{
	for(int i=18;i>=0;i--)
	{
		if(((k>>i)&1)==1)
		{
			n1=f[n1][i];
		}
	}
	return n1;
}
void dfs2(int n1,int len)
{
	for(int i=1;i<=tot;i++)
	{
		if(len>=t[i])
		{
			int r=len;
			int l=len-t[i];
			if(cur[r]-cur[l]*p[t[i]]==h[i])
			{
				cnt[get(n1,t[i])]++;
			}
		}
	}
	len++;
	if(l[0][n1])
	{
		cur[len]=cur[len-1]*P+1;
		dfs2(l[0][n1],len);
	}
	if(r[0][n1])
	{
		cur[len]=cur[len-1]*P+2;
		dfs2(r[0][n1],len);
	}
	len--;
	if(cnt[n1]==tot)
	{
		ans.push_back(n1);
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	p[0]=1;
	for(int i=1;i<=300000;i++)
	{
		p[i]=p[i-1]*P;
	}
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n;
		f[0][0]=-1;
		for(int i=0;i<n;i++)
		{
			cnt[i]=0;
			cin>>l[0][i]>>r[0][i];
			if(l[0][i])
			{
				f[l[0][i]][0]=i;
			}
			if(r[0][i])
			{
				f[r[0][i]][0]=i;
			}
		}
		pre();
		int m;
		cin>>m;
		for(int i=0;i<m;i++)
		{
			cin>>l[1][i]>>r[1][i];
		}
		tot=0;
		dfs1(0,0);
		ans.clear();
		dfs2(0,0);
		cout<<ans.size()<<endl;
		sort(ans.begin(),ans.end());
		for(int i=0;i<ans.size();i++)
		{
			if(i!=0)
			{
				cout<<" ";
			}
			cout<<ans[i];
		}
		cout<<endl;
	}
	return 0;
}

标签:DNA,cur,int,len,20,树形,n1,300005
From: https://www.cnblogs.com/watersail/p/18385466

相关文章

  • LOJ #160. 树形背包 题解
    Description有\(N\)个物品,编号分别为\(1\ldotsN\)。物品\(i\)的重量为\(w_i\),价值为\(v_i\)。给出每个物品依赖于哪个物品。我们用\(d_i=j\(i>j>0)\)表示:如果要选取物品\(i\),就必须先选取物品\(j\)。另外,我们用\(d_i=0(i>0)\)表示:该物品不依赖于任何物品。......
  • 羟基脲是一种细胞凋亡诱导剂,可通过抑制核糖核苷酸还原酶 来抑制DNA 的合成 |MedChemEx
    中文名:羟基脲CAS:127-07-1品牌:MedChemExpress(MCE)存储条件:Powder:-20°C,3years;4°C,2years.Insolvent:-80°C,6months;-20°C,1month.生物活性:羟基脲是一种细胞凋亡诱导剂,可通过抑制核糖核苷酸还原酶 来抑制DNA 的合成。羟基脲具有抗正痘病毒活性。 ......
  • 树形菜单节点上下移动(同级别)
     在软件开发过程中,有遇到过树形菜单节点排序问题,如节点上移、节点下移。以下是一种实现方式,请工程师们审查是否合理!     publicclassNodeInfoEntity{///<summary>///id///</summary>[Column(Name="id")]publicstringId{......
  • ant design vue 表格table 和复选框Checkbox结合 实现树形数据操作
    前言:最近在做一个权限管理的页面,需要配置权限。业务给的要求在表格里,展示权限以及编辑权限。然后根据权限数组,动态展示模块。页面需求:可以设定每个公司或者部门的单独权限,可以编辑保存权限主要实现:1.全选,反选(递归循环,every,some实现)2.子级选中其父级选中,父级取消子级也取消3.......
  • 【图像加密解密】6维超混沌系统和DNA编码的图像加密解密【含Matlab源码 7257期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • 树形 dp 做题笔记
    在这个随笔中,会有笔者的一些做题笔记,包括但不限于树形dp的思想、解题技巧、代码实现等。CF1926GVladandTroubleatMIT\(\texttt{*1900}\)。TAG:\(\texttt{树形dp}\)\(dp_{i,S,P}\)为\(i\)的子树内是否存在S和P的状态。转移方程为:当\(s_i\)为C时dp[x]......
  • 树形 dp
    在树上运行的dp叫做树形dp。题单。树形dp入门问题例1.1:没有上司的舞会我们发现,对于一个节点,要么选或不选,且题目中要求求出权值最大的方案,不妨分别设\(dp_{i,0},dp_{i,1}\)为在以\(i\)为根的子树中,第\(i\)个点选或不选情况下的最大权值。那么可以得到\[dp_{i,0}=......
  • 修复DNA
    AC自动机上DP的典型题目假设我们已经获得了最终的串,那么将这个串放在AC自动机上匹配的时候,一定是不会匹配到一个模式串的,我们考虑利用这一点来DP设\(f[i][j]\)表示将经过修改后的文本串的前\(i\)个字符放在AC自动机上匹配中途没有匹配到模式串且当前匹配到AC自动机的\(j\)号节点......
  • 洛谷P7767 DNA 题解
    ProblemSolution考虑DP。设\(dp_{i,0}\)表示前\(i\)个字符全为A的最小操作次数,\(dp_{i,1}\)表示前\(i\)个数全为B的最小操作次数。考虑转移。若当前位为A则\(dp_{i,0}=\min(dp_{i-1,0},dp_{i-1,1}+1)\),\(dp_{i,1}=\min(dp_{i-1,0}+1,dp_{i-1,1}+1)\);若当前位......
  • 树形结构查找(B树、B+树)
    平衡树结构的树高为O(logn),平衡树结构包括两种平衡二叉树结构(分别为AVL树和RBT)以及一种树结构(B-Tree,又称B树,它的度大于2)。AVL树和RBT适合内部存储的应用,而B树适合外部存储的应用。对于B树,应掌握其查找、插入以及删除的操作过程,对于B+树(一种B树的变形树......