Advertisement
esraa_syam

Untitled

Jul 22nd, 2024
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6.  
  7. void FIO() {
  8. #ifndef ONLINE_JUDGE
  9.     freopen("../in.txt", "r", stdin);
  10.     freopen("../out.txt", "w", stdout);
  11. #endif
  12. }
  13.  
  14. const int N = 1e5 + 5;
  15. vector<int> adj[N];
  16. int up[N][20], tin[N], tout[N], depth[N], timer = 1;
  17. ll hs[N][2][2];
  18. int arr[N];
  19. int n;
  20.  
  21. ll pw[N][2], invPw[N][2], base[2], mod[2];
  22.  
  23. ll power(ll x, ll p, ll MOD = 1) {
  24.     ll ret = 1;
  25.     while (p) {
  26.         if (p & 1) {
  27.             ret = (ret * x) % MOD;
  28.         }
  29.         p >>= 1;
  30.         x = (x * x) % MOD;
  31.     }
  32.     return ret;
  33. }
  34.  
  35. void pre_hash() {
  36.     base[0] = 131, base[1] = 157;
  37.     mod[0] = 1e9 + 7, mod[1] = 1e9 + 9;
  38.     pw[0][0] = pw[0][1] = 1;
  39.     for (int i = 1; i < N; ++i) {
  40.         for (int j = 0; j < 2; ++j) {
  41.             pw[i][j] = pw[i - 1][j] * base[j] % mod[j];
  42.         }
  43.     }
  44.     invPw[N - 1][0] = power(pw[N - 1][0], mod[0] - 2, mod[0]);
  45.     invPw[N - 1][1] = power(pw[N - 1][1], mod[1] - 2, mod[1]);
  46.     for (int i = N - 2; i >= 0; --i) {
  47.         for (int j = 0; j < 2; ++j) {
  48.             invPw[i][j] = base[j] * invPw[i + 1][j] % mod[j];
  49.         }
  50.     }
  51. }
  52.  
  53. void dfs(int u, int p) {
  54.     tin[u] = ++timer;
  55.     up[u][0] = p;
  56.     for (int i = 1; i < 20; ++i) {
  57.         up[u][i] = up[up[u][i - 1]][i - 1];
  58.     }
  59.  
  60.     // up
  61.     for (int j = 0; j < 2; ++j) {
  62.         hs[u][0][j] = hs[p][0][j] * base[j] % mod[j] + arr[u];
  63.         hs[u][0][j] %= mod[j];
  64.     }
  65.  
  66.     // down
  67.     for (int j = 0; j < 2; ++j) {
  68.         hs[u][1][j] = hs[p][1][j] + arr[u] * pw[depth[p]][j];
  69.         hs[u][1][j] %= mod[j];
  70.     }
  71.  
  72.     for (auto v: adj[u]) {
  73.         if (v == p)
  74.             continue;
  75.         depth[v] = depth[u] + 1;
  76.         dfs(v, u);
  77.  
  78.     }
  79.     tout[u] = timer++;
  80. }
  81.  
  82. bool isAnc(int u, int v) {
  83.     return tin[u] <= tin[v] && tout[v] <= tout[u];
  84. }
  85.  
  86. int lca(int u, int v) {
  87.     if (isAnc(u, v))
  88.         return u;
  89.     if (isAnc(v, u))
  90.         return v;
  91.     for (int l = 19; l >= 0; --l) {
  92.         if (!isAnc(up[u][l], v))
  93.             u = up[u][l];
  94.     }
  95.     return up[u][0];
  96. }
  97.  
  98. void solve() {
  99.     cin >> n;
  100.     for (int i = 1; i <= n; ++i) {
  101.         char c;
  102.         cin >> c;
  103.         arr[i] = (c - 'a' + 1);
  104.     }
  105.     for (int i = 1; i < n; ++i) {
  106.         int u, v;
  107.         cin >> u >> v;
  108.         adj[u].push_back(v);
  109.         adj[v].push_back(u);
  110.     }
  111.     tout[0] = 1e9;
  112.     pre_hash();
  113.     dfs(1, 0);
  114.     int q;
  115.     cin >> q;
  116.     while (q--) {
  117.         int u, v;
  118.         cin >> u >> v;
  119.         array<array<ll, 2>, 2> hss{};
  120.         int lc = lca(u, v);
  121.         for (int i = 0; i < 2; ++i, swap(u, v)) {
  122.             for (int j = 0; j < 2; ++j) {
  123.                 int len = depth[u] - depth[lc] + 1;
  124.                 hss[i][j] += hs[u][0][j] - (hs[up[lc][0]][0][j] * pw[len][j]) % mod[j] + mod[j];
  125.                 hss[i][j] %= mod[j];
  126.                 ll down = hs[v][1][j] - hs[lc][1][j] + mod[j];
  127.                 down *= invPw[depth[lc]][j];
  128.                 down %= mod[j];
  129.                 down *= pw[len][j];
  130.                 down %= mod[j];
  131.                 hss[i][j] += down;
  132.                 hss[i][j] %= mod[j];
  133.             }
  134.         }
  135.         cout << (hss[0] == hss[1]) << '\n';
  136.     }
  137. }
  138.  
  139.  
  140. int main() {
  141.     ios_base::sync_with_stdio(false);
  142.     cin.tie(nullptr);
  143.     cout.tie(nullptr);
  144.     FIO();
  145.  
  146.     int t = 1;
  147. //    cin >> t;
  148.     while (t--) {
  149.         solve();
  150.     }
  151.     return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement