JSOI2016 獨特的樹葉

2022-03-19 21:09:44 字數 821 閱讀 5936

仙題+1.

我們發現如果能夠求出來\(a\)樹中任何乙個點當根的時候的\(hash\)值,那麼就可以求出答案了。

然後你隨便寫一寫\(hash\)策略改成\(xor\),發現\(xor\)的逆運算就是\(xor\),好啊!

換根\(dp\)直接求出我們需要的,然後放到\(set\)去就行了。

#include#include#include#include#include#include#include#include#includeusing namespace std;

#define re register

#define ll long long

inline int gi()

while(ch>='0' && ch<='9')

return f*sum;

}const int n=100010;

typedef unsigned int ull;

const ull base=19491001;

mapmp;

struct treee[n<<1];

void add(int u,int v);front[u]=cnt;}

ull f[n],g[n];

void dfs1(int u,int ff)

} void dfs2(int u,int ff)

}}a,b;

int d[n];

int main()

for(int i=1;i<=n+1;i++)

if(d[i]==1)

} return 0;

}

JSOI2016 獨特的樹葉

點此看題 其實就是判斷樹同構,然後自然聯想到了樹has hhash hash 簡單介紹一下樹雜湊的方法,我們先求出子樹的has hhash hash 值g i g i g i 我用的是質數 自然溢位的方式,設p i p i p i 為第i ii個質數,那麼轉移 g u 1 g v p siz v g...

JSOI2016 獨特的樹葉

有一顆大小為 n 的樹 a 現加上乙個節點並打亂編號,形成樹 b 詢問加上的節點最後編號是多少?判斷樹的同構顯然需要樹雜湊。可以先將樹 a 中以每個節點為根的雜湊值算出來存進乙隻 unordered set 中,然後在樹 b 中隨便找乙個不是葉節點的節點為根,列舉去掉乙個葉節點,看根的 hash 值...

JSOI2016 獨特的樹葉(樹雜湊)

這個題只要求出以每個點為根的有根 無標號 樹的hash值就好了。我以前的樹雜湊是把樹轉為括號序,這個太麻煩了。一種方法是每個點的權值定義為siz,找到乙個dfs序,使得經過的點的權值字典序組最小。這個對於這道題也不方便,因為換根是可能需要字首和字尾和搞。在網上看到一種的hash是這個 f x 1 s...