当前位置: 首页 > news >正文

P5043 【模板】树同构([BJOI2015]树的同构)

传送门

把所有的树给哈希起来就好了
具体的方法是一个节点的哈希值就是它所有儿子的哈希值给哈希起来,然后以每个节点为根算出它作为根节点的哈希值。那么把每棵树的哈希值排个序,与之前的比较就好了
注意把儿子的哈希值给哈希起来的时候要把他们排个序

// luogu-judger-enable-o2
//minamoto
#include<bits/stdc++.h>
#define R register int
#define fp(i,a,b) for(R i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R i=a,I=b-1;i>I;--i)
#define go(u) for(R i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
    R res,f=1;char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
const int N=1005,Base=233,P=998244353;
struct eg{int v,nx;}e[N];int head[N],tot;
inline void add(R u,R v){e[++tot]={v,head[u]},head[u]=tot;}
int n,m,q[N][N],ans[N][N],u;
int Hash(int u,int fa){
    int ans=N,top=0;
    go(u)if(v!=fa)q[u][++top]=Hash(v,u);
    sort(q[u]+1,q[u]+1+top);
    fp(i,1,top)ans=(1ll*ans*Base+q[u][i])%P;
    return (1ll*ans*Base+N+1)%P;
}
int main(){
//  freopen("testdata.in","r",stdin);
    m=read();
    fp(i,1,m){
        tot=0,n=read();fp(j,1,n)head[j]=0;
        fp(j,1,n)if((u=read()))add(u,j),add(j,u);
        fp(j,1,n)ans[i][j]=Hash(j,0);
        sort(ans[i]+1,ans[i]+n+1);
        for(R j=1,k=0;j<=i;++j){
            while(k<=n&&ans[i][++k]==ans[j][k]);
            if(k>n){printf("%d\n",j);break;}
        }
    }return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10063467.html

相关文章:

  • SUSE10.1在VM安装时No catalog found的解决办法
  • 当你不能回答别人的提问时怎么办
  • 今天是上来看看的
  • JAVA常用知识总结(十一)——数据库(一)
  • ARM入门笔记(2)
  • LeetCode:191. 位1的个数
  • 51cto开博
  • 5-6 可变参数
  • js内置数据类型
  • 网络安全英语词汇
  • Linux中安装JDK1.8
  • 在Windows 2000下优化Oracle9i性能
  • 股票买卖问题
  • 2003的服务器终端服务器超出最大连接数的解决办法-转载
  • vue项目首页形成原理
  • Google 是如何开发 Web 框架的
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java小白进阶笔记(3)-初级面向对象
  • mockjs让前端开发独立于后端
  • Next.js之基础概念(二)
  • redis学习笔记(三):列表、集合、有序集合
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SQLServer插入数据
  • 盘点那些不知名却常用的 Git 操作
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 学习Vue.js的五个小例子
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ###项目技术发展史
  • #微信小程序:微信小程序常见的配置传旨
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (转)负载均衡,回话保持,cookie
  • *** 2003
  • @AutoConfigurationPackage的使用
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @javax.ws.rs Webservice注解
  • [ C++ ] STL---string类的使用指南
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [Android]通过PhoneLookup读取所有电话号码
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [BZOJ2208][Jsoi2010]连通数
  • [C#]扩展方法
  • [C++]AVL树怎么转
  • [GN] Vue3.2 快速上手 ---- 核心语法2
  • [iOS开发]事件处理与响应者链
  • [javaSE] GUI(事件监听机制)
  • [JS] node.js 入门
  • [Linux]知识整理(持续更新)
  • [NOIP2018 PJ T4]对称二叉树