P3458地铁系统
问题描述
一些大城市的地铁线路呈一棵树状,一条树枝就是一条双向地铁道路,它直接连接两个站点。任意两个站点间,有且仅有一条路径可以到达。
大多数这样的城市都有一个中央地铁站,你是一个地铁迷,假设你现在就在一座这样的城市,你想要探索所有的地铁站。你从中央地铁站出发,随机选了一条地铁线就出发了。每到一个地铁站,你都会选一条没走过的道路继续乘地铁旅行。如果当前你所在的地铁站连接的所有道路你都探索过了,那么你会回到上一个车站,继续探索,直到你探索玩所有地铁站,也就是每条道路来回走过两次(其实就是深度优先搜索遍历一棵树的过程)。那时,你会身处中央车站,你凭记忆写下了一串由0和1构成的数字,来表示整个旅行的过程,其中0表示你离中央车站远了一点,1表示你离中央车站近了一点(0表示向下搜索,1表示回溯)。
如上图所示,中间的大黑圆点表示中央车站,从它出法,遍历整棵树的顺序可以有很多种,右侧给出了其中的3中顺序。它们都表示遍历同一棵树。
你的记事本上记下了两次探索过程,问这两次探索的是否是相同的地铁系统?
输入格式
两行,每行一个由0和1构成的字符串,字符串的长度不超过3000.
输出格式
如果两个字符串表示的是相同的地铁系统,输出“same”,否则输出”different”
样例输入
样例1:
0010011101001011
0100011011001011
样例2:
0100101100100111
0011000111010101
样例输出
样例1:
same
样例2:
different
用栈模拟递归过程来连边,连完边之后直接树哈希。
关于树哈希,这道题我用的是,令父亲节点的哈希值为
$Hash[fa]=(a\times p \bigoplus Hash[son_1] ) \% q\times p\bigoplus Hash[son_2] \% q……\times b \% q$
递归计算即可。
代码:
1 |
|