Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3.  
  4. using namespace std;
  5.  
  6. struct node {
  7. map<char, int> to;
  8. int slink = -1;
  9. int link = -1;
  10. vector<int> term;
  11. char pc = '$';
  12. int p = -1;
  13. ll to_add = 0;
  14.  
  15. node(){}
  16. };
  17.  
  18. const int max_sz = 1000050;
  19.  
  20. node trie[max_sz];
  21. int sz = 1;
  22.  
  23. void add(string& s, int id) {
  24. int cur = 0;
  25. for (int i = 0; i < s.length(); i++) {
  26. if (!trie[cur].to.count(s[i])) {
  27. trie[sz].p = cur;
  28. trie[sz].pc = s[i];
  29. trie[cur].to[s[i]] = sz++;
  30. }
  31. cur = trie[cur].to[s[i]];
  32. }
  33. trie[cur].term.push_back(id);
  34. }
  35.  
  36. int go(int v, char c);
  37.  
  38. int go_link(int v) {
  39. if (trie[v].link == -1) {
  40. if (v == 0 || trie[v].p == 0) {
  41. trie[v].link = 0;
  42. } else {
  43. trie[v].link = go(go_link(trie[v].p), trie[v].pc);
  44. }
  45. }
  46. return trie[v].link;
  47. }
  48.  
  49. int go_slink(int v) {
  50. if (trie[v].slink == -1) {
  51. if (trie[go_link(v)].term.size() != 0 || v == 0) {
  52. trie[v].slink = go_link(v);
  53. } else {
  54. trie[v].slink = go_slink(go_link(v));
  55. }
  56. }
  57. return trie[v].slink;
  58. }
  59.  
  60. int go(int v, char c) {
  61. if (!trie[v].to.count(c)) {
  62. if (v == 0) {
  63. trie[v].to[c] = 0;
  64. } else {
  65. trie[v].to[c] = go(go_link(v), c);
  66. }
  67. }
  68. return trie[v].to[c];
  69. }
  70.  
  71. vector<vector<pair<int, char>>> g;
  72. vector<int> dp;
  73. vector<ll> occur;
  74.  
  75. void dfs(int v, int p, int state) {
  76. int cur = state;
  77. while (cur != 0) {
  78. if (trie[cur].term.size() != 0) {
  79. trie[cur].to_add += dp[v];
  80. }
  81. cur = go_slink(cur);
  82. }
  83. for (pair<int, char>& to : g[v]) {
  84. if (to.first == p) continue;
  85. dfs(to.first, v, go(state, to.second));
  86. }
  87. }
  88.  
  89. int dfs_dp(int v, int p) {
  90. for (pair<int, char>& to : g[v]) {
  91. dp[v] += dfs_dp(to.first, v);
  92. }
  93. return dp[v];
  94. }
  95.  
  96. int main()
  97. {
  98. ios_base::sync_with_stdio(false);
  99. cin.tie(0);
  100. cout.tie(0);
  101. int n;
  102. cin >> n;
  103. g.assign(n + 1, vector<pair<int, char>>());
  104. dp.assign(n + 1, 0);
  105. int p, term;
  106. string pc;
  107. for (int i = 0; i < n; i++) {
  108. cin >> p >> pc >> term;
  109. g[p].push_back({i + 1, pc[0]});
  110. dp[i + 1] = term;
  111. }
  112. dfs_dp(0, -1);
  113. cin >> n;
  114. occur.assign(n, 0);
  115. string s;
  116. for (int i = 0; i < n; i++) {
  117. cin >> s;
  118. add(s, i);
  119. }
  120. dfs(0, -1, 0);
  121. for (int i = 0; i < sz; i++) {
  122. for (int j : trie[i].term) {
  123. occur[j] += trie[i].to_add;
  124. }
  125. }
  126. for (int i = 0; i < n; i++) {
  127. cout << occur[i] << '\n';
  128. }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement