the_art_of_war

AGRA TASK WITH HASH_TABLE

Dec 26th, 2016
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1. // God & me
  2. // "Someone like you" ? Unbelievable ...
  3. #include <bits/stdc++.h>
  4. using namespace std;
  5. const int maxn = 5e5 + 17, z = 26, inf = 1e9;
  6. vector<int> adj[maxn], near_mask[maxn];
  7. int n, big[maxn], a[maxn], sz[maxn], cur, ans[maxn], h[maxn], bag[maxn], tmp[maxn];
  8. int st[maxn], ft[maxn], ver[maxn], dfs_time;
  9. char s[maxn];
  10. void pre_dfs(int v = 0){
  11. st[v] = dfs_time++;
  12. ver[ st[v] ] = v;
  13. sz[v] = 1, big[v] = -1;
  14. for(auto u : adj[v]){
  15. a[u] = (1 << s[u] - 'a') ^ a[v];
  16. h[u] = h[v] + 1;
  17. pre_dfs(u);
  18. sz[v] += sz[u];
  19. if(big[v] == -1 || sz[u] > sz[ big[v] ])
  20. big[v] = u;
  21. }
  22. ft[v] = dfs_time;
  23. }
  24. void dfs(int v = 0, bool cl = 0){
  25. for(auto u : adj[v])
  26. if(u != big[v])
  27. dfs(u, 1), ans[v] = max(ans[v], ans[u]);
  28. if(big[v] != -1)
  29. dfs(big[v], 0), ans[v] = max(ans[v], ans[ big[v] ]);
  30. for(auto u : adj[v])
  31. if(u != big[v]){
  32. for(int p = st[u]; p < ft[u]; p++){
  33. int x = ver[p];
  34. for(auto mask : near_mask[ a[x] ])
  35. cur = max(cur, h[x] + bag[mask] - 2 * h[v]);
  36. }
  37. for(int p = st[u]; p < ft[u]; p++)
  38. bag[ a[ ver[p] ] ] = max(bag[ a[ ver[p] ] ], h[ ver[p] ]);
  39. }
  40. for(auto mask : near_mask[ a[v] ])
  41. cur = max(cur, bag[mask] - h[v]);
  42. bag[ a[v] ] = max(bag[ a[v] ], h[v]);
  43. ans[v] = max(ans[v], cur);
  44. if(cl){
  45. for(int p = st[v]; p < ft[v]; p++)
  46. bag[ a[ ver[p] ] ] = -inf;
  47. cur = 0;
  48. }
  49. }
  50. const int V=2000003;
  51. bitset<1 << 26> has;
  52. int sta[V],ky[V];
  53. struct Hash_table{ // adapted from TooDifficult code
  54. int fst[V], nxt[V];
  55. int T,p;
  56. void init() {
  57. T=1; p=0;
  58. }
  59. void insert(int s) {
  60. if(has[s]) return ;
  61. int S=s%V;
  62. nxt[T]=fst[S],fst[S]=T,sta[T]=s,ky[T++]=p++;
  63. }
  64. int query(int s) {
  65. for (int j=fst[s%V];j;j=nxt[j]) if (sta[j]==s) return ky[j];
  66. }
  67. }Hash;
  68. void init(){
  69. copy(a, a + n, tmp);
  70. sort(tmp, tmp + n);
  71. int sz = unique(tmp, tmp + n) - tmp;
  72. Hash.init();
  73. for(int i = 0; i < sz; i++)
  74. Hash.insert(tmp[i]), has.set(tmp[i]);
  75. for(int i = 0; i < sz; i++){
  76. near_mask[i].push_back(i);
  77. for(int b = 0; b < z; b++)
  78. if(has.test(tmp[i] ^ (1 << b)))
  79. near_mask[i].push_back(Hash.query(tmp[i] ^ (1 << b)));
  80. }
  81. for(int i = 0; i < n; i++)
  82. a[i] = Hash.query(a[i]);
  83. }
  84. int main(){
  85. scanf("%d", &n);
  86. for(int i = 1, p; i < n; i++){
  87. scanf("%d %c", &p, &s[i]), p--;
  88. adj[p].push_back(i);
  89. }
  90. fill(begin(bag), end(bag), -inf);
  91. pre_dfs();
  92. init();
  93. dfs();
  94. for(int i = 0; i < n; i++) printf("%d ", ans[i]);
  95. return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment