Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.71 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define _USE_MATH_DEFINES
  3. #include <ext/pb_ds/assoc_container.hpp>
  4. #include <ext/pb_ds/tree_policy.hpp>
  5. #include <bits/stdc++.h>
  6. /*#pragma GCC target ("avx2")
  7. #pragma GCC optimization ("O3")
  8. #pragma GCC optimization ("unroll-loops")*/
  9.  
  10. using namespace __gnu_pbds;
  11. using namespace std;
  12.  
  13. #define ll long long
  14. #define ld long double
  15. #define mp make_pair
  16. #define what_is(x) cerr << #x << " is " << x << endl;
  17.  
  18. typedef tree<
  19. int,
  20. null_type,
  21. less<int>,
  22. rb_tree_tag,
  23. tree_order_statistics_node_update>
  24. ordered_set;
  25.  
  26. /*
  27. const int p = 998244353;
  28.  
  29.  
  30. int mul(int a, int b) {
  31. return (1LL * a * b) % p;
  32. }
  33.  
  34. int add(int a, int b) {
  35. int s = (a+b);
  36. s = s%p;
  37. if (s<0) s+=p;
  38. return s;
  39. }
  40.  
  41. int sub(int a, int b) {
  42. int s = (a-b);
  43. s = s%p;
  44. if (s<0) s+=p;
  45. return s;
  46. }
  47.  
  48. int po(int a, int deg)
  49. {
  50. if (deg==0) return 1;
  51. if (deg%2==1) return mul(a, po(a, deg-1));
  52. int t = po(a, deg/2);
  53. return mul(t, t);
  54. }
  55.  
  56. int inv(int n)
  57. {
  58. return po(n, p-2);
  59. }
  60. */
  61. vector<int> Z(vector<int> s)
  62. {
  63. int n = s.size();
  64. vector<int> z(n);
  65. int L = 0, R = 0;
  66. for (int i = 1; i < n; i++) {
  67. if (i > R) {
  68. L = R = i;
  69. while (R < n && s[R-L] == s[R]) R++;
  70. z[i] = R-L; R--;
  71. } else {
  72. int k = i-L;
  73. if (z[k] < R-i+1) z[i] = z[k];
  74. else {
  75. L = i;
  76. while (R < n && s[R-L] == s[R]) R++;
  77. z[i] = R-L; R--;
  78. }
  79. }
  80. }
  81. return z;
  82. }
  83.  
  84. mt19937 rnd(time(0));
  85. /*
  86. struct Line {
  87. mutable ll k, m, p;
  88. bool operator<(const Line& o) const { return k < o.k; }
  89. bool operator<(ll x) const { return p < x; }
  90. };
  91.  
  92. struct CHT : multiset<Line, less<>> {
  93. // (for doubles, use inf = 1/.0, div(a,b) = a/b)
  94. const ll inf = LLONG_MAX;
  95. ll div(ll a, ll b) { // floored division
  96. return a / b - ((a ^ b) < 0 && a % b); }
  97. bool isect(iterator x, iterator y) {
  98. if (y == end()) { x->p = inf; return false; }
  99. if (x->k == y->k) x->p = x->m > y->m ? inf : -inf;
  100. else x->p = div(y->m - x->m, x->k - y->k);
  101. return x->p >= y->p;
  102. }
  103. void add(ll k, ll m) {
  104. auto z = insert({k, m, 0}), y = z++, x = y;
  105. while (isect(y, z)) z = erase(z);
  106. if (x != begin() && isect(--x, y)) isect(x, y = erase(y));
  107. while ((y = x) != begin() && (--x)->p >= y->p)
  108. isect(x, erase(y));
  109. }
  110. ll query(ll x) {
  111. assert(!empty());
  112. auto l = *lower_bound(x);
  113. return l.k * x + l.m;
  114. }
  115. };
  116. */
  117.  
  118.  
  119. const int N = 500000;
  120.  
  121. const int K = 26;
  122.  
  123. struct vertex
  124. {
  125. int nxt[K];
  126. int p;
  127. int pch;
  128. int link;
  129. int go[K];
  130. };
  131.  
  132. vertex t[N];
  133.  
  134. int sz;
  135.  
  136. void init()
  137. {
  138. t[0].p = 0;
  139. t[0].link = 0;
  140. t[0].pch = -1;
  141. for (int i = 0; i<K; i++) {t[0].nxt[i] = -1; t[0].go[i] = -1;}
  142. sz = 1;
  143. }
  144.  
  145.  
  146.  
  147. vector<char> letter(N);
  148. vector<int> par(N);
  149. vector<vector<int>> son(N);
  150. vector<int> leaf_position(N);
  151.  
  152. void add_string(int iter, string s)
  153. {
  154. //cout<<iter<<" iteration:\n";
  155. int n = s.size();
  156. int start = 0;
  157. for (int i = 0; i<n; i++) {
  158. //cout<<start<<' '<<sz<<' ';
  159. if (t[start].nxt[s[i] - 'a'] == -1)
  160. {
  161. //cout<<"YES ";
  162. t[start].nxt[s[i]-'a'] = sz;
  163. //cout<<t[start].nxt[s[i]-'a'];
  164. t[sz].p = start;
  165. t[sz].pch = s[i]-'a';
  166. t[sz].link = -1;
  167. for (int j = 0; j<K; j++) {t[sz].nxt[j] = -1; t[sz].go[j] = -1;}
  168. sz++;
  169. }
  170. //cout<<endl;
  171. start = t[start].nxt[s[i]-'a'];
  172. }
  173. leaf_position[iter] = start;
  174. }
  175.  
  176. int go(int v, int ch);
  177.  
  178. int find_link(int v)
  179. {
  180. if (t[v].link==-1)
  181. {
  182. if (v==0 || t[v].p == 0) t[v].link = 0;
  183. else
  184. {
  185. t[v].link = go(find_link(t[v].p), t[v].pch);
  186. }
  187. }
  188.  
  189. return t[v].link;
  190. }
  191.  
  192. int go(int v, int ch)
  193. {
  194. if (t[v].go[ch]==-1)
  195. {
  196. if (t[v].nxt[ch]!=-1)
  197. {
  198. t[v].go[ch] = t[v].nxt[ch];
  199. }
  200. else
  201. {
  202. if (v == 0) t[v].go[ch] = 0;
  203. else t[v].go[ch] = go(find_link(v), ch);
  204. }
  205. }
  206.  
  207. return t[v].go[ch];
  208. }
  209.  
  210.  
  211. vector<vector<int>> G_links(N);
  212.  
  213. int timer = 0;
  214.  
  215. vector<int> t_in(N);
  216. vector<int> t_out(N);
  217.  
  218. void dfs_links(int start, int p)
  219. {
  220. t_in[start] = timer++;
  221. for (auto it: G_links[start]) if (it!=p) dfs_links(it, start);
  222. t_out[start] = timer;
  223. }
  224.  
  225. vector<int> value(4*N);
  226.  
  227. void upd(int v, int tl, int tr, int pos, int val)
  228. {
  229. if (tl==tr) {value[v]+=val; return;}
  230. int mid = (tl+tr)/2;
  231. if (pos<=mid) upd(2*v, tl, mid, pos, val);
  232. else upd(2*v+1, mid+1, tr, pos, val);
  233.  
  234. value[v] = value[2*v] + value[2*v+1];
  235. }
  236.  
  237. int get(int v, int tl, int tr, int l, int r)
  238. {
  239. if (tl==l&&tr==r) return value[v];
  240. if (l>r) return 0;
  241. int mid = (tl+tr)/2;
  242. return get(2*v, tl, mid, l, min(r, mid)) + get(2*v+1, mid+1, tr, max(l, mid+1), r);
  243. }
  244.  
  245. int n, m;
  246. vector<string> queries;
  247. vector<vector<int>> to_ans;
  248. vector<int> answer;
  249.  
  250. void dfs_songs(int start, int state)
  251. {
  252. cout<<"we are at "<<start<<endl;
  253. upd(1, 0, N-1, state, 1);
  254. cout<<"upd "<<state<<" +1"<<endl;
  255. for (auto it: to_ans[start])
  256. {
  257. int k = leaf_position[it];
  258. answer[it] = get(1, 0, N-1, t_in[k], t_out[k]-1);
  259. cout<<"ask on "<<t_in[k]<<' '<<t_out[k]-1<<endl;
  260. }
  261. for (auto it: son[start])
  262. {
  263. cout<<state<<' '<<letter[it]-'a'<<' '<<go(state, letter[it]-'a')<<endl;
  264. dfs_songs(it, go(state, letter[it]-'a'));
  265. }
  266. upd(1, 0, N-1, state, -1);
  267. cout<<"upd "<<state<<" -1"<<endl;
  268. }
  269.  
  270.  
  271.  
  272. int main() {
  273. ios_base::sync_with_stdio(0);
  274. cin.tie(nullptr);
  275.  
  276. cin>>n;
  277. for (int i = 1; i<=n; i++)
  278. {
  279. int op;
  280. cin>>op;
  281. if (op==1)
  282. {
  283. char c;
  284. cin>>c;
  285. letter[i] = c;
  286. par[i] = 0;
  287. son[0].push_back(i);
  288. }
  289. else
  290. {
  291. char c;
  292. cin>>par[i]>>c;
  293. son[par[i]].push_back(i);
  294. letter[i] = c;
  295. }
  296. }
  297. cin>>m;
  298. answer.resize(m);
  299. queries.resize(m);
  300. to_ans.resize(n+1);
  301. for (int i = 0; i<m; i++)
  302. {
  303. int kek;
  304. cin>>kek>>queries[i];
  305. to_ans[kek].push_back(i);
  306. }
  307.  
  308. //for (auto it: queries) cout<<it<<endl;
  309.  
  310. init();
  311.  
  312.  
  313.  
  314. for (int i = 0; i<m; i++) add_string(i, queries[i]);
  315.  
  316.  
  317. for (int i = 0; i<sz; i++)
  318. {
  319. int k = find_link(i);
  320. //cout<<k<<endl;
  321. if (i!=0) G_links[k].push_back(i);
  322. }
  323.  
  324. /*for (int i = 0; i<K; i++) cout<<i<<": "<<t[0].nxt[i]<<endl;*/
  325.  
  326.  
  327. for (int i = 0; i<sz; i++) cout<<i<<": "<<find_link(i)<<endl;
  328.  
  329. for (int i = 0; i<=sz; i++)
  330. {
  331. for (auto it: G_links[i]) cout<<it<<' ';
  332. cout<<endl;
  333. }
  334.  
  335. cout<<"WE GOT HERE"<<endl;
  336.  
  337. /*for (int i = 0; i<sz; i++)
  338. {
  339. cout<<"state "<<i<<": "<<endl;
  340. for (int j = 0; j<K; j++) cout<<j<<": "<<t[i].nxt[j]<<' '<<t[i].go[j]<<"| ";
  341. cout<<endl;
  342. cout<<t[i].link<<' ';
  343. cout<<t[i].p<<' ';
  344. cout<<t[i].pch<<endl;
  345. }*/
  346.  
  347. dfs_links(0, -1);
  348.  
  349. for (int i = 0; i<sz; i++) cout<<i<<": "<<t_in[i]<<' '<<t_out[i]<<endl;
  350.  
  351. for (int i = 0; i<m; i++) cout<<i<<": "<<leaf_position[i]<<' ';
  352. cout<<endl;
  353.  
  354. for (int i = 0; i<=n; i++)
  355. {
  356. cout<<i<<": ";
  357. for (auto it: to_ans[i]) cout<<it<<' ';
  358. cout<<endl;
  359. }
  360.  
  361. dfs_songs(0, 0);
  362. for (int i = 0; i<m; i++) cout<<answer[i]<<endl;
  363. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement