AhmedAshraff

Untitled

Jul 15th, 2024
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.37 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. #define boAshraf { ios_base::sync_with_stdio(false); cin.tie(NULL); }
  6. #define ll long long
  7. #define sz(s) (int)(s).size()
  8. #define endl "\n"
  9. #define ordered_set tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update>
  10.  
  11. #include <ext/pb_ds/assoc_container.hpp>
  12. #include <ext/pb_ds/tree_policy.hpp>
  13.  
  14. using namespace __gnu_pbds;
  15. using namespace std;
  16.  
  17. const int N = 2e5 + 5, mod1 = 1e9 + 7, p1 = 29, mod2 = 1e9 + 9, p2 = 31;
  18. const int LOG = 25;
  19. int pw1[N], inverse1[N];
  20. int pw2[N], inverse2[N];
  21. vector<vector<int>> pref1, pref2;
  22. vector<int> adj[N];
  23. char ch[N];
  24. int up[N][LOG], in[N], out[N], depth[N], timer;
  25.  
  26. int add(int a, int b, int mod) {
  27.     return (0LL + a + b + mod) % mod;
  28. }
  29.  
  30. int mul(int a, int b, int mod) {
  31.     return (1LL * a * b) % mod;
  32. }
  33.  
  34. int FP(int b, int p, int mod) {
  35.     if (!p) return 1;
  36.     int ans = FP(b, p >> 1, mod);
  37.     ans = mul(ans, ans, mod);
  38.     if (p & 1) ans = mul(ans, b, mod);
  39.     return ans;
  40. }
  41.  
  42. void pre() {
  43.     pw1[0] = inverse1[0] = 1;
  44.     pw2[0] = inverse2[0] = 1;
  45.     for (int i = 1; i < N; ++i) {
  46.         pw1[i] = mul(pw1[i - 1], p1, mod1);
  47.         inverse1[i] = FP(pw1[i], mod1 - 2, mod1);
  48.         pw2[i] = mul(pw2[i - 1], p2, mod2);
  49.         inverse2[i] = FP(pw2[i], mod2 - 2, mod2);
  50.     }
  51. }
  52.  
  53. void pref_calc(const string &s) {
  54.     int n = sz(s);
  55.     pair<int, int> val = {0, 0};
  56.     for (int i = 0; i < n; ++i) {
  57.         val.first = add(val.first, mul(s[i] - 'a' + 1, pw1[i], mod1), mod1);
  58.         pref1.back().push_back(val.first);
  59.         val.second = add(val.second, mul(s[i] - 'a' + 1, pw2[i], mod2), mod2);
  60.         pref2.back().push_back(val.second);
  61.     }
  62. }
  63.  
  64. pair<int, int> calc(int l, int r, int idx) {
  65.     if (l == 0) return {pref1[idx][r], pref2[idx][r]};
  66.     int x = mul(add(pref1[idx][r], -pref1[idx][l - 1], mod1), inverse1[l], mod1);
  67.     int y = mul(add(pref2[idx][r], -pref2[idx][l - 1], mod2), inverse2[l], mod2);
  68.     return {x, y};
  69. }
  70.  
  71. bool palin(int idx, int l, int r) {
  72.     int add = sz(pref1) / 2;
  73.     int l2=sz(pref1[idx])-1-r;
  74.     int r2=sz(pref1[idx])-1-l;
  75.     return calc(l, r, idx) == calc(l2, r2, idx + add);
  76. }
  77.  
  78. void dfs(int u, int p) {
  79.     in[u] = timer++;
  80.     up[u][0] = p;
  81.     for (int i = 1; i < LOG; ++i) {
  82.         if (up[u][i - 1] != -1)
  83.             up[u][i] = up[up[u][i - 1]][i - 1];
  84.         else
  85.             up[u][i] = -1;
  86.     }
  87.     for (auto v: adj[u]) {
  88.         if (v != p) {
  89.             depth[v] = depth[u] + 1;
  90.             dfs(v, u);
  91.         }
  92.     }
  93.     out[u] = timer++;
  94. }
  95.  
  96. int ancestor(int node, int l) {
  97.     for (int i = 0; i < LOG; ++i) {
  98.         if (l & (1 << i)) {
  99.             node = up[node][i];
  100.             if (node == -1) return -1;
  101.         }
  102.     }
  103.     return node;
  104. }
  105.  
  106. int bs1(int root, vector<int> &v) {
  107.     int st = 0, ed = v.size() - 1, L = -1;
  108.     while (st <= ed) {
  109.         int mid = (st + ed) / 2;
  110.         int curr_node = v[mid];
  111.         if (in[curr_node] >= in[root] ) {
  112.             L = mid;
  113.             ed = mid - 1;
  114.         } else st = mid + 1;
  115.     }
  116.     return L;
  117. }
  118.  
  119. int bs2(int root, vector<int> &v) {
  120.     int st = 0, ed = v.size() - 1, R = -1;
  121.     while (st <= ed) {
  122.         int mid = (st + ed) / 2;
  123.         int curr_node = v[mid];
  124.         if (out[curr_node] <= out[root]) {
  125.             R = mid;
  126.             st = mid + 1;
  127.         } else ed = mid - 1;
  128.     }
  129.     return R;
  130. }
  131.  
  132. void File();
  133.  
  134. void sol();
  135.  
  136. int main() {
  137.     boAshraf
  138.     File();
  139.     int t = 1;
  140.     cin >> t;
  141.     pre();
  142.     while (t--) {
  143.         sol();
  144.     }
  145.     return 0;
  146. }
  147.  
  148. void sol() {
  149.     timer = 0;
  150.     int n, q;
  151.     cin >> n >> q;
  152.     for (int i = 1; i <= n; ++i) {
  153.         cin >> ch[i];
  154.     }
  155.     for (int i = 1; i <= n; ++i) {
  156.         adj[i].clear();
  157.         for (int j = 0; j < LOG; ++j) {
  158.             up[i][j] = -1;
  159.         }
  160.     }
  161.     for (int i = 2; i <= n; ++i) {
  162.         int v;
  163.         cin >> v;
  164.         adj[v].push_back(i);
  165.     }
  166.     for (int i = 1; i <= n; ++i) {
  167.         sort(adj[i].begin(), adj[i].end());
  168.     }
  169.  
  170.     dfs(1, -1);
  171.  
  172.  
  173.     vector<string> level;
  174.     vector<vector<int>> level_nodes;
  175.     queue<int> Q;
  176.     Q.push(1);
  177.     while (!Q.empty()) {
  178.         string x = "";
  179.         vector<int> temp;
  180.         int ss = sz(Q);
  181.         while (ss--) {
  182.             int u = Q.front();
  183.             Q.pop();
  184.             x += ch[u];
  185.             temp.push_back(u);
  186.             for (auto v: adj[u]) {
  187.                 depth[v] = depth[u] + 1;
  188.                 Q.push(v);
  189.             }
  190.         }
  191.         level.push_back(x);
  192.         level_nodes.push_back(temp);
  193.     }
  194.     for (auto &it: level) {
  195.         pref1.push_back(vector<int>());
  196.         pref2.push_back(vector<int>());
  197.         pref_calc(it);
  198.     }
  199.     for (auto &it: level) {
  200.         reverse(it.begin(), it.end());
  201.         pref1.push_back(vector<int>());
  202.         pref2.push_back(vector<int>());
  203.         pref_calc(it);
  204.     }
  205.  
  206.     while (q--) {
  207.         int node, l;
  208.         cin >> node >> l;
  209.         int root = ancestor(node, l);
  210.         int L = bs1(root, level_nodes[depth[node]]);
  211.         int R = bs2(root, level_nodes[depth[node]]);
  212.         cout << (palin(depth[root] + l, L, R) ? "YES" : "NO") << endl;
  213.     }
  214.     pref1 = pref2 = vector<vector<int>>();
  215. }
  216.  
  217. void File() {
  218. #ifndef ONLINE_JUDGE
  219.     freopen("input.txt", "r", stdin);
  220.     freopen("output.txt", "w", stdout);
  221. #endif
  222. }
Advertisement
Add Comment
Please, Sign In to add comment