山理工校赛 E.bLue的二叉树 dfs序+字符串匹配(KMP、哈希)
来源:互联网 发布:棉花基因组数据库 编辑:程序博客网 时间:2024/05/22 03:21
传送门:bLue的二叉树
思路:求第一棵树的子树有多少个和第二棵树相同,刚看题的时候还看错了,以为是两棵树的子树有多少个相同的,想都没想就写了个哈希,写完发现好像不太对,我是在dfs的过程中哈希的,但是连样例都过不了,就开始怀疑自己是不是子树的定义搞错了。。然后就凌乱了。。
正解:将两棵树按dfs序做成字符串,注意空节点也要用一个不会出现在其他节点的值加到字符串当中。做出字符串来后再做个字符串匹配就好了。。
至于为什么能这么做,我自己认为的是一个包含空节点的先序序列能惟一的确定一颗二叉树,把空节点加到串中也能避免出现两个子树的序列连起来恰好形成了待匹配的序列的情况。
据说直接对子树哈希也能过,不过姿势要好,看来是我姿势太差劲了。。连样例都过不了。。
还据说搜索+强剪枝也能过。。
代码(哈希求的字符串匹配):
#include<bits/stdc++.h>using namespace std;#define MAXN 100007#define ll long long#define ull unsigned long longconst ull P=1e9+7;vector<int>a[MAXN],b[MAXN];int c1[MAXN],c2[MAXN];int in[MAXN];int n,m;string w1,w2;void dfs1(int u){if(!u){w1+='A';return ;} for(int i=0;i<a[u].size();i++) { int v=a[u][i]; dfs1(v); } w1+=(c1[u]+'A'); return ;}void dfs2(int u){if(!u){w2+='A';return ;} for(int i=0;i<b[u].size();i++) { int v=b[u][i]; dfs2(v); } w2+=(c2[u]+'A'); return ;}int main(){ int w,l,r; while(~scanf("%d%d",&n,&m)) { w1=""; w2=""; for(int i=0;i<MAXN;i++) { a[i].clear(); b[i].clear(); in[i]=0; } for(int i=1;i<=n;i++) { scanf("%d%d%d",&c1[i],&l,&r); //if(l!=0) a[i].push_back(l),in[l]++; //if(r!=0) a[i].push_back(r),in[r]++; } int rt1,rt2; for(int i=1;i<=n;i++) if(in[i]==0) { rt1=i; break; } memset(in,0,sizeof(in)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&c2[i],&l,&r); //if(l!=0) b[i].push_back(l),in[l]++; //if(r!=0) b[i].push_back(r),in[r]++; } for(int i=1;i<=m;i++) if(in[i]==0) { rt2=i; break; } ll ans=0; dfs1(rt1); dfs2(rt2); //cout<<w1<<endl<<w2<<endl; ull T=0,S=0,xx=1; for(int i=0;i<w2.size();i++) { xx*=P; T=w2[i]+T*P; S=w1[i]+S*P;}if(S==T)ans++;int sz=w2.size();for(int i=sz;i<w1.size();i++){S=S*P+w1[i]-w1[i-sz]*xx;if(S==T)ans++;} printf("%lld\n",ans); }}
阅读全文
0 0
- 山理工校赛 E.bLue的二叉树 dfs序+字符串匹配(KMP、哈希)
- sdutoj 3926 blue的二叉树 先序遍历+KMP
- 山东理工acm 3926 bLue的二叉树
- poj 3080 Blue Jeans kmp 字符串匹配
- SUDT 3926 bLue的二叉树 [KMP or hash]【思维】
- codeforces #336 E. Marbles (字符串hash或者kmp匹配)
- Blue Jeans(字符串kmp)
- 字符串的匹配 -KMP
- kmp字符串的匹配
- poj3080--Blue Jeans(字符串匹配)
- KMP(字符串匹配)
- poj 3080 Blue Jeans(KMP匹配,枚举子串)
- 字符串匹配的KMP算法(二)
- 字符串匹配的KMP算法(转载)
- KMP算法(字符串的匹配)
- 字符串的模式匹配(BF、KMP)
- 南阳理工ACM(字符串匹配)
- 字符串的模式匹配(朴素匹配、KMP)
- Android 耳机插拔流程源码跟踪浅析
- C语言中volatile关键字的作用
- android studio将外部sqlite3数据库导入到Android项目中
- C++11线程池的实现
- 微信小程序架构分析 (上)
- 山理工校赛 E.bLue的二叉树 dfs序+字符串匹配(KMP、哈希)
- DirectX 12 持续整理 ——2. 矩阵
- 【Java.NIO】SelectionKey,***监听的事件***
- 17.Intent的含义与分类
- EOS Platform7.5配置了固定时刻触发的定时任务,没有准确的按照配置的间隔时间触发
- Win7怎么打开磁盘管理?
- windows安装cygwin运行shell脚本 $'\r': 未找到命令的解决方法
- 810C. Do you want a date?
- Android Studio编译问题:ProcessException: org.gradle.process.internal.ExecException