bhupixb

Zscoder

Apr 2nd, 2019
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. #pragma GCC optimize("unroll-loops,no-stack-protector")
  5. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  6.  
  7. using namespace std;
  8. using namespace __gnu_pbds;
  9.  
  10. #define fi first
  11. #define se second
  12. #define mp make_pair
  13. #define pb push_back
  14.  
  15. typedef long long ll;
  16. typedef pair<ll,ll> ii;
  17. typedef vector<ll> vi;
  18. typedef unsigned long long ull;
  19. typedef long double ld;
  20. typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;
  21.  
  22. //This template is compiled by zscoder.
  23.  
  24. //O(V^2E) Dinic Flow
  25. //Initialize : MaxFlow<# of vertices, Max Value> M;
  26. template<int MX, ll INF> struct MaxFlow //by yutaka1999, have to define INF and MX (the Max number of vertices)
  27. {
  28. struct edge
  29. {
  30. int to,cap,rev;
  31. edge(int to=0,int cap=0,int rev=0):to(to),cap(cap),rev(rev){}
  32. };
  33. vector <edge> vec[MX];
  34. int level[MX];
  35. int iter[MX];
  36.  
  37. void addedge(int s,int t,int c) //adds an edge of cap c to the flow graph
  38. {
  39. int S=vec[s].size(),T=vec[t].size();
  40. vec[s].push_back(edge(t,c,T));
  41. vec[t].push_back(edge(s,0,S));
  42. }
  43. void bfs(int s)
  44. {
  45. memset(level,-1,sizeof(level));
  46. queue <int> que;
  47. level[s] = 0;
  48. que.push(s);
  49. while (!que.empty())
  50. {
  51. int v = que.front();que.pop();
  52. for(int i=0;i<vec[v].size();i++)
  53. {
  54. edge&e=vec[v][i];
  55. if (e.cap>0&&level[e.to]<0)
  56. {
  57. level[e.to]=level[v]+1;
  58. que.push(e.to);
  59. }
  60. }
  61. }
  62. }
  63. ll flow_dfs(int v,int t,ll f)
  64. {
  65. if (v==t) return f;
  66. for(int &i=iter[v];i<vec[v].size();i++)
  67. {
  68. edge &e=vec[v][i];
  69. if (e.cap>0&&level[v]<level[e.to])
  70. {
  71. ll d=flow_dfs(e.to,t,min(f,ll(e.cap)));
  72. if (d>0)
  73. {
  74. e.cap-=d;
  75. vec[e.to][e.rev].cap+=d;
  76. return d;
  77. }
  78. }
  79. }
  80. return 0;
  81. }
  82. ll maxflow(int s,int t) //finds max flow using dinic from s to t
  83. {
  84. ll flow = 0;
  85. while(1)
  86. {
  87. bfs(s);
  88. if (level[t]<0) return flow;
  89. memset(iter,0,sizeof(iter));
  90. while (1)
  91. {
  92. ll f=flow_dfs(s,t,INF);
  93. if(f==0) break;
  94. flow += f;
  95. }
  96. }
  97. }
  98. };
  99. //End Dinic Flow
  100.  
  101. //Sparse Table Struct
  102. //SparseTable<ll, 1000001, 20, ll(1e18)> ST;
  103. template<typename TT, int MX, int LG, ll INF> struct SparseTable //Warning : Change query return value manually if needed. INF is the dummy val
  104. {
  105. TT st[LG][MX];
  106. TT initial[MX];
  107.  
  108. TT combine(TT a, TT b) //warning : change if neccesary
  109. {
  110. if(a<b) return a;
  111. return b;
  112. }
  113.  
  114. SparseTable()
  115. {
  116. for(int i = 0; i < MX; i++) initial[i] = INF;
  117. }
  118.  
  119. void init()
  120. {
  121. for(ll j = 0; j < LG; j++)
  122. {
  123. for(ll i = 0; i < MX; i++)
  124. {
  125. st[j][i] = INF;
  126. if(i + (1<<j) - 1 < MX)
  127. {
  128. if(j == 0) st[j][i] = initial[i];
  129. else st[j][i] = combine(st[j-1][i], st[j-1][i + (1<<(j-1))]);
  130. }
  131. }
  132. }
  133. }
  134.  
  135. TT query(int l, int r)
  136. {
  137. int k = 31 - __builtin_clz(r-l);
  138. if(l==r) k=0;
  139. return combine(st[k][l], st[k][r - (1<<k) + 1]);
  140. }
  141. };
  142.  
  143. //Segment Tree Lazy Prop begin. node and update are just samples and should be changed according to problem
  144. //use init, upd, and query function ([l, r])
  145. //REMEMBER TO SET WIDTH WHEN INIT LEAVES!
  146. template<typename T, typename U> struct SegmentTree //by socketnaut. see http://codeforces.com/blog/entry/20528
  147. {
  148. int S, H;
  149.  
  150. T zero;
  151. vector<T> value;
  152.  
  153. U noop;
  154. vector<bool> dirty; //a.k.a is_lazy
  155. vector<U> prop; //the update array
  156.  
  157. SegmentTree<T, U>(int _S, T _zero = T(), U _noop = U()) {
  158. zero = _zero, noop = _noop;
  159. for (S = 1, H = 1; S < _S; ) S *= 2, H++;
  160.  
  161. value.resize(2*S, zero);
  162. dirty.resize(2*S, false);
  163. prop.resize(2*S, noop);
  164. }
  165.  
  166. void init(vector<T> &leaves) {
  167. copy(leaves.begin(), leaves.end(), value.begin() + S);
  168.  
  169. for (int i = S - 1; i > 0; i--)
  170. value[i] = value[2 * i] + value[2 * i + 1];
  171. }
  172.  
  173. void apply(int i, U &update) {
  174. value[i] = update(value[i]);
  175. if(i < S) {
  176. prop[i] = prop[i] + update;
  177. dirty[i] = true;
  178. }
  179. }
  180.  
  181. void rebuild(int i) {
  182. for (int l = i/2; l; l /= 2) {
  183. T combined = value[2*l] + value[2*l+1];
  184. value[l] = prop[l](combined);
  185. }
  186. }
  187.  
  188. void propagate(int i) {
  189. for (int h = H; h > 0; h--) {
  190. int l = i >> h;
  191.  
  192. if (dirty[l]) {
  193. apply(2*l, prop[l]);
  194. apply(2*l+1, prop[l]);
  195.  
  196. prop[l] = noop;
  197. dirty[l] = false;
  198. }
  199. }
  200. }
  201.  
  202. void upd(int i, int j, U update) {
  203. i += S, j += S;
  204. propagate(i), propagate(j);
  205.  
  206. for (int l = i, r = j; l <= r; l /= 2, r /= 2) {
  207. if((l&1) == 1) apply(l++, update);
  208. if((r&1) == 0) apply(r--, update);
  209. }
  210.  
  211. rebuild(i), rebuild(j);
  212. }
  213.  
  214. T query(int i, int j){
  215. i += S, j += S;
  216. propagate(i), propagate(j);
  217.  
  218. T res_left = zero, res_right = zero;
  219. for(; i <= j; i /= 2, j /= 2){
  220. if((i&1) == 1) res_left = res_left + value[i++];
  221. if((j&1) == 0) res_right = value[j--] + res_right;
  222. }
  223. return res_left + res_right;
  224. }
  225. };
  226.  
  227. struct node
  228. {
  229. int sum, width;
  230.  
  231. node operator+(const node &n)
  232. {
  233. node tmp;
  234. tmp.sum = sum + n.sum;
  235. tmp.width = width + n.width;
  236. return tmp;
  237. }
  238. };
  239.  
  240. struct update {
  241. bool type; // 0 for add, 1 for reset
  242. int value;
  243.  
  244. node operator()(const node &n)
  245. {
  246. node tmp;
  247. if (type)
  248. {
  249. tmp.sum = n.width * value;
  250. tmp.width = n.width;
  251. }
  252. else
  253. {
  254. tmp.sum = n.sum + n.width * value;
  255. tmp.width = n.width;
  256. }
  257. return tmp;
  258. }
  259.  
  260. update operator+(const update &u)
  261. {
  262. update tmp;
  263. if (u.type) return u; //since it's a reset
  264. tmp.type = type;
  265. tmp.value = value + u.value;
  266. return tmp;
  267. }
  268. };
  269. //Segment Tree end
  270.  
  271. //DSU start
  272. struct DSU
  273. {
  274. int S;
  275.  
  276. struct node
  277. {
  278. int p; ll sum;
  279. };
  280. vector<node> dsu;
  281.  
  282. DSU(int n)
  283. {
  284. S = n;
  285. for(int i = 0; i < n; i++)
  286. {
  287. node tmp;
  288. tmp.p = i; tmp.sum = 0;
  289. dsu.pb(tmp);
  290. }
  291. }
  292.  
  293. void reset(int n)
  294. {
  295. dsu.clear();
  296. S = n;
  297. for(int i = 0; i < n; i++)
  298. {
  299. node tmp;
  300. tmp.p = i; tmp.sum = 0;
  301. dsu.pb(tmp);
  302. }
  303. }
  304.  
  305. int rt(int u)
  306. {
  307. if(dsu[u].p == u) return u;
  308. dsu[u].p = rt(dsu[u].p);
  309. return dsu[u].p;
  310. }
  311.  
  312. void merge(int u, int v)
  313. {
  314. u = rt(u); v = rt(v);
  315. if(u == v) return ;
  316. if(rand()&1) swap(u, v);
  317. dsu[v].p = u;
  318. dsu[u].sum += dsu[v].sum;
  319. }
  320.  
  321. bool sameset(int u, int v)
  322. {
  323. if(rt(u) == rt(v)) return true;
  324. return false;
  325. }
  326.  
  327. ll getstat(int u)
  328. {
  329. return dsu[rt(u)].sum;
  330. }
  331. };
  332. //DSU end
  333.  
  334. //Order Stat Tree start
  335. struct PBDS
  336. {
  337. tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> t;
  338. int timer;
  339.  
  340. PBDS(){timer = 0;}
  341. void insert(int x)
  342. {
  343. t.insert(mp(x, timer));
  344. timer++;
  345. }
  346.  
  347. int lower(int x)
  348. {
  349. return t.order_of_key(ii(x, -1));
  350. }
  351.  
  352. void del(int x) //make sure x exists
  353. {
  354. ii tmp = (*t.find_by_order(lower(x)));
  355. t.erase(tmp);
  356. }
  357.  
  358. int higher(int x)
  359. {
  360. int tmp = lower(x+1);
  361. return (int(t.size()) - tmp);
  362. }
  363. };
  364. //End Order Stat Tree
  365.  
  366. //Start NT
  367. struct NumberTheory
  368. {
  369. vector<ll> primes;
  370. vector<bool> prime;
  371. vector<ll> totient;
  372. vector<ll> sumdiv;
  373. vector<ll> bigdiv;
  374. void Sieve(ll n)
  375. {
  376. prime.assign(n+1, 1);
  377. prime[1] = false;
  378. for(ll i = 2; i <= n; i++)
  379. {
  380. if(prime[i])
  381. {
  382. primes.pb(i);
  383. for(ll j = i*2; j <= n; j += i)
  384. {
  385. prime[j] = false;
  386. }
  387. }
  388. }
  389. }
  390.  
  391. ll phi(ll x)
  392. {
  393. map<ll,ll> pf;
  394. ll num = 1; ll num2 = x;
  395. for(ll i = 0; primes[i]*primes[i] <= x; i++)
  396. {
  397. if(x%primes[i]==0)
  398. {
  399. num2/=primes[i];
  400. num*=(primes[i]-1);
  401. }
  402. while(x%primes[i]==0)
  403. {
  404. x/=primes[i];
  405. pf[primes[i]]++;
  406. }
  407. }
  408. if(x>1)
  409. {
  410. pf[x]++; num2/=x; num*=(x-1);
  411. }
  412. x = 1;
  413. num*=num2;
  414. return num;
  415. }
  416.  
  417. bool isprime(ll x)
  418. {
  419. if(x==1) return false;
  420. for(ll i = 0; primes[i]*primes[i] <= x; i++)
  421. {
  422. if(x%primes[i]==0) return false;
  423. }
  424. return true;
  425. }
  426.  
  427. void SievePhi(ll n)
  428. {
  429. totient.resize(n+1);
  430. for (int i = 1; i <= n; ++i) totient[i] = i;
  431. for (int i = 2; i <= n; ++i)
  432. {
  433. if (totient[i] == i)
  434. {
  435. for (int j = i; j <= n; j += i)
  436. {
  437. totient[j] -= totient[j] / i;
  438. }
  439. }
  440. }
  441. }
  442.  
  443. void SieveSumDiv(ll n)
  444. {
  445. sumdiv.resize(n+1);
  446. for(int i = 1; i <= n; ++i)
  447. {
  448. for(int j = i; j <= n; j += i)
  449. {
  450. sumdiv[j] += i;
  451. }
  452. }
  453. }
  454.  
  455. ll getPhi(ll n)
  456. {
  457. return totient[n];
  458. }
  459.  
  460. ll getSumDiv(ll n)
  461. {
  462. return sumdiv[n];
  463. }
  464.  
  465. ll modpow(ll a, ll b, ll mod)
  466. {
  467. ll r = 1;
  468. if(b < 0) b += mod*100000LL;
  469. while(b)
  470. {
  471. if(b&1) r = (r*a)%mod;
  472. a = (a*a)%mod;
  473. b>>=1;
  474. }
  475. return r;
  476. }
  477.  
  478. ll inv(ll a, ll mod)
  479. {
  480. return modpow(a, mod - 2, mod);
  481. }
  482.  
  483. ll invgeneral(ll a, ll mod)
  484. {
  485. ll ph = phi(mod);
  486. ph--;
  487. return modpow(a, ph, mod);
  488. }
  489.  
  490. void getpf(vector<ii>& pf, ll n)
  491. {
  492. for(ll i = 0; primes[i]*primes[i] <= n; i++)
  493. {
  494. int cnt = 0;
  495. while(n%primes[i]==0)
  496. {
  497. n/=primes[i]; cnt++;
  498. }
  499. if(cnt>0) pf.pb(ii(primes[i], cnt));
  500. }
  501. if(n>1)
  502. {
  503. pf.pb(ii(n, 1));
  504. }
  505. }
  506.  
  507. //ll op;
  508. void getDiv(vector<ll>& div, vector<ii>& pf, ll n, int i)
  509. {
  510. //op++;
  511. ll x, k;
  512. if(i >= pf.size()) return ;
  513. x = n;
  514. for(k = 0; k <= pf[i].se; k++)
  515. {
  516. if(i==int(pf.size())-1) div.pb(x);
  517. getDiv(div, pf, x, i + 1);
  518. x *= pf[i].fi;
  519. }
  520. }
  521. };
  522. //End NT
  523.  
  524. //Start Fenwick (by Christopherboo)
  525. struct Fenwick
  526. {
  527. vector<ll> t;
  528. Fenwick(int n)
  529. {
  530. t.assign(n+1,0);
  531. }
  532. void reset(int n)
  533. {
  534. t.assign(n+1, 0);
  535. }
  536. void update(int p, ll v)
  537. {
  538. for (; p < (int)t.size(); p += (p&(-p))) t[p] += v;
  539. }
  540. ll query(int r) //finds [1, r] sum
  541. {
  542. ll sum = 0;
  543. for (; r; r -= (r&(-r))) sum += t[r];
  544. return sum;
  545. }
  546. ll query(int l, int r) //finds [l, r] sum
  547. {
  548. if(l == 0) return query(r);
  549. return query(r) - query(l-1);
  550. }
  551. };
  552. //End Fenwick
  553.  
  554. //Start FenwickRange (by Christopherboo)
  555. struct FenwickRange
  556. {
  557. vector<ll> fw, fw2;
  558. int siz;
  559. FenwickRange(int N)
  560. {
  561. fw.assign(N+1,0);
  562. fw2.assign(N+1,0);
  563. siz = N+1;
  564. }
  565. void reset(int N)
  566. {
  567. fw.assign(N+1,0);
  568. fw2.assign(N+1,0);
  569. siz = N+1;
  570. }
  571. void update(int l, int r, ll val) //[l, r] + val
  572. {
  573. for (int tl = l; tl < siz; tl += (tl&(-tl)))
  574. {
  575. fw[tl] += val, fw2[tl] -= val * ll(l - 1);
  576. }
  577. for (int tr = r + 1; tr < siz; tr += (tr&(-tr)))
  578. {
  579. fw[tr] -= val, fw2[tr] += val * ll(r);
  580. }
  581. }
  582. ll sum(int r) //[1, r]
  583. {
  584. ll res = 0;
  585. for (int tr = r; tr; tr -= (tr&(-tr)))
  586. {
  587. res += fw[tr] * ll(r) + fw2[tr];
  588. }
  589. return res;
  590. }
  591. ll query(ll l, ll r)
  592. {
  593. if(l == 0) return sum(r);
  594. else return sum(r)-sum(l-1);
  595. }
  596. };
  597. //End FenwickRange
  598.  
  599. //Start Fenwick2D (by Christopherboo)
  600. struct Fenwick2D
  601. {
  602. int R, C;
  603. vector< vector<ll> > fw;
  604. Fenwick2D(int r, int c)
  605. {
  606. R = r; C = c;
  607. fw.assign(R+1, vector<ll>(C+1,0));
  608. }
  609. void reset(int r, int c)
  610. {
  611. R = r; C = c;
  612. fw.assign(R+1, vector<ll>(C+1,0));
  613. }
  614. void update(int row, int col, ll val)
  615. {
  616. for (int r = row; r < R; r += (r&(-r)))
  617. {
  618. for(int c = col; c < C; c += (c&(-c)))
  619. {
  620. fw[r][c] += val;
  621. }
  622. }
  623. }
  624. ll sum(int row, int col) // inclusive
  625. {
  626. ll res = 0;
  627. for (int r = row; r; r -= (r&(-r)))
  628. {
  629. for(int c = col; c; c -= (c&(-c)))
  630. {
  631. res += fw[r][c];
  632. }
  633. }
  634. return res;
  635. }
  636. ll query(int x1, int y1, int x2, int y2)
  637. {
  638. return sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1);
  639. }
  640. };
  641. //End Fenwick2D
  642.  
  643. //Begin Matrix (from Um_nik's submission)
  644. const int mod = int(1e9) + 7;
  645. const int DIM = 52;
  646.  
  647. struct Matrix {
  648. int a[DIM][DIM];
  649. int *operator [] (int r) { return a[r]; };
  650.  
  651. Matrix(int x = 0) {
  652. memset(a, 0, sizeof a);
  653. if (x)
  654. {
  655. for(int i = 0; i < DIM; i++) a[i][i] = x;
  656. }
  657. }
  658. } const I(1);
  659.  
  660. Matrix operator * (Matrix A, Matrix B) {
  661. const ll mod2 = ll(mod) * mod;
  662. Matrix C;
  663. for(int i = 0; i < DIM; i++)
  664. {
  665. for(int j = 0; j < DIM; j++)
  666. {
  667. ll w = 0;
  668. for(int k = 0; k < DIM; k++)
  669. {
  670. w += ll(A[i][k]) * B[k][j];
  671. if (w >= mod2) w -= mod2;
  672. }
  673. C[i][j] = w % mod;
  674. }
  675. }
  676. return C;
  677. }
  678.  
  679. Matrix operator ^ (Matrix A, ll b) {
  680. Matrix R = I;
  681. for (; b > 0; b /= 2) {
  682. if (b % 2) R = R*A;
  683. A = A*A;
  684. }
  685. return R;
  686. }
  687. //End Matrix
  688.  
  689. //Begin suffix auto
  690. //Most of this are from here : https://saisumit.wordpress.com/2016/01/26/suffix-automaton/
  691. template<int MAXLEN> struct SuffixAutomaton //check if it works (works only for 'a' - 'z', for general alphabet sets see code from SUBST1
  692. {
  693. struct state
  694. {
  695. int len, link;
  696. int nxt[26];
  697. };
  698.  
  699. state st[MAXLEN*2];
  700. int sz, last;
  701. bool terminal[MAXLEN*2];
  702.  
  703. void reset()
  704. {
  705. for(int i = 0; i < MAXLEN*2; i++)
  706. {
  707. st[i].len = 0; st[i].link = -1;
  708. for(int j = 0; j < 26; j++)
  709. {
  710. st[i].nxt[j] = 0;
  711. }
  712. }
  713. sz = last = 0;
  714. st[0].len = 0;
  715. st[0].link = -1;
  716. ++sz;
  717. }
  718.  
  719. void sa_init()
  720. {
  721. for(int i = 0; i < MAXLEN*2; i++)
  722. {
  723. st[i].len = 0; st[i].link = -1;
  724. for(int j = 0; j < 26; j++)
  725. {
  726. st[i].nxt[j] = 0;
  727. }
  728. }
  729. sz = last = 0;
  730. st[0].len = 0;
  731. st[0].link = -1;
  732. ++sz;
  733. }
  734.  
  735. void sa_extend (char d)
  736. {
  737. int c = (d-'a');
  738. int cur = sz++;
  739. st[cur].len = st[last].len + 1;
  740. int p;
  741. for (p=last; (p!=-1 && st[p].nxt[c]==0); p=st[p].link)
  742. {
  743. st[p].nxt[c] = cur;
  744. }
  745. if (p == -1)
  746. {
  747. st[cur].link = 0;
  748. }
  749. else
  750. {
  751. int q = st[p].nxt[c];
  752. if (st[p].len + 1 == st[q].len)
  753. {
  754. st[cur].link = q;
  755. }
  756. else
  757. {
  758. int clone = sz++;
  759. st[clone].len = st[p].len + 1;
  760. for(int i = 0; i < 26; i++) {st[clone].nxt[i] = st[q].nxt[i];}
  761. st[clone].link = st[q].link;
  762. for (; p!=-1 && st[p].nxt[c]==q; p=st[p].link)
  763. {
  764. st[p].nxt[c] = clone;
  765. }
  766. st[q].link = st[cur].link = clone;
  767. }
  768. }
  769. last = cur;
  770. }
  771.  
  772. void build(string &s)
  773. {
  774. sa_init();
  775. for(int i = 0; i < s.length(); i++)
  776. {
  777. sa_extend(s[i]);
  778. }
  779. }
  780.  
  781. void constructTerminal()
  782. {
  783. memset(terminal, false, sizeof(terminal));
  784. int p = last;
  785. while(p>0)
  786. {
  787. terminal[p] = true;
  788. p = st[p].link;
  789. }
  790. }
  791.  
  792. vector<int> dst;
  793.  
  794. void initDistSub()
  795. {
  796. dst.assign(MAXLEN*2+3, 0);
  797. }
  798.  
  799. int DistSub(int ver)
  800. {
  801. int tp = 1;
  802.  
  803. if(dst[ver]) return dst[ver];
  804.  
  805. for(int i=0;i<26;i++)
  806. {
  807. if(st[ver].nxt[i])
  808. {
  809. tp+= DistSub(st[ver].nxt[i]);
  810. }
  811. }
  812.  
  813. dst[ver] = tp;
  814. if(ver==0) dst[ver]--;
  815. return dst[ver];
  816. }
  817.  
  818. int GetDistSub()
  819. {
  820. initDistSub();
  821. return DistSub(0); //if empty string counts, don't -1
  822. }
  823.  
  824. bool isSubstring(string &p, string &s) //test if p is a substring of s (bug check)
  825. {
  826. int cur = 0;
  827. for(int i = 0; i < p.size(); i++)
  828. {
  829. if(st[cur].nxt[p[i]-'a'] == 0) return false;
  830. cur = st[cur].nxt[p[i]-'a'];
  831. }
  832. return true;
  833. }
  834.  
  835. bool isSuffix(string &p, string &s) //true if p is a suffix of s. Must use constructTerminal first! (bug check)
  836. {
  837. int cur = 0;
  838. for(int i = 0; i < p.size(); i++)
  839. {
  840. if(st[cur].nxt[p[i]-'a'] == 0) return false;
  841. cur = st[cur].nxt[p[i]-'a'];
  842. }
  843. if(terminal[cur]) return true;
  844. }
  845.  
  846. vi totalLength;
  847.  
  848. ll leSub(int ver)
  849. {
  850. int tp = 0;
  851. if(totalLength[ver]) return totalLength[ver];
  852. for(int i=0;i<26;i++)
  853. {
  854. if(st[ver].nxt[i])
  855. {
  856. tp = leSub(st[ver].nxt[i]) + dst[st[ver].nxt[i]];
  857. }
  858. }
  859. totalLength[ver] = tp;
  860. return tp;
  861. }
  862.  
  863. ll totalLengthDist() //must run GetDistSub() before use
  864. {
  865. totalLength.resize(MAXLEN*2, 0);
  866. return leSub(0);
  867. }
  868.  
  869. void klex(ll &k, string &ans) //run GetDistSub() first. finds the k-th lexicographical smallest substring of the string and store answer in s. Start at node 0.
  870. {
  871. int now = 0;
  872. while(1)
  873. {
  874. for(int c = 0; c < 26; c++)
  875. {
  876. if(st[now].nxt[c])
  877. {
  878. if(k <= dst[st[now].nxt[c]])
  879. {
  880. now = st[now].nxt[c];
  881. ans += char(c+'a');
  882. break;
  883. }
  884. else
  885. {
  886. k -= dst[st[now].nxt[c]];
  887. }
  888. }
  889. }
  890. //cerr << now << ' ' << k << '\n';
  891. k--;
  892. if(k==0) break;
  893. }
  894. }
  895.  
  896. int LCS(string &t) //Returns size of longest Common Substring of s (the current string) and t. Can be modified to return the string itself.
  897. {
  898. int v = 0, l = 0;
  899. int best = 0; int bestpos = 0;
  900. for(int i = 0; i < int(t.length()); i++)
  901. {
  902. while(v && !st[v].nxt[t[i]-'a'])
  903. {
  904. v = st[v].link;
  905. l = st[v].len;
  906. }
  907. if(st[v].nxt[t[i]-'a'])
  908. {
  909. v = st[v].nxt[t[i]-'a'];
  910. l++;
  911. }
  912. if(l > best)
  913. {
  914. best = l; bestpos = i;
  915. }
  916. }
  917. //best string is from bestpos - best + 1 to bestpos;
  918. return best;
  919. }
  920. };
  921. //End suffix auto
  922.  
  923. //Begin Suffix + LCP Array
  924. string globalstr;
  925.  
  926. bool smaller_first_char(int a, int b)
  927. {
  928. return globalstr[a] < globalstr[b];
  929. }
  930.  
  931. //pos[i] is the real suffix array
  932. struct SuffixLCPArray //to work for general alphabet remove the - 'a'
  933. {
  934. vi rnk, pos, cnt, nxt;
  935. vector<bool> bh, b2h;
  936.  
  937. void buildSA(const string& str)
  938. {
  939. globalstr = str;
  940. int n = str.length();
  941. rnk.assign(n,0);
  942. pos.assign(n,0);
  943. cnt.assign(n,0);
  944. nxt.assign(n,0);
  945. bh.assign(n,0);
  946. b2h.assign(n,0);
  947. for (int i=0; i<n; ++i)
  948. {
  949. pos[i] = i;
  950. }
  951. sort(pos.begin(), pos.end(), smaller_first_char);
  952. for (int i=0; i<n; ++i)
  953. {
  954. bh[i] = i == 0 || str[pos[i]] != str[pos[i-1]];
  955. b2h[i] = false;
  956. }
  957. for (int h = 1; h < n; h <<= 1)
  958. {
  959. int buckets = 0;
  960. for (int i=0, j; i < n; i = j)
  961. {
  962. j = i + 1;
  963. while (j < n && !bh[j]) j++;
  964. nxt[i] = j;
  965. buckets++;
  966. }
  967. if (buckets == n) break;
  968.  
  969. for (int i = 0; i < n; i = nxt[i])
  970. {
  971. cnt[i] = 0;
  972. for (int j = i; j < nxt[i]; ++j)
  973. {
  974. rnk[pos[j]] = i;
  975. }
  976. }
  977.  
  978. cnt[rnk[n - h]]++;
  979. b2h[rnk[n - h]] = true;
  980. for (int i = 0; i < n; i = nxt[i])
  981. {
  982. for (int j = i; j < nxt[i]; ++j)
  983. {
  984. int s = pos[j] - h;
  985. if (s >= 0){
  986. int head = rnk[s];
  987. rnk[s] = head + cnt[head]++;
  988. b2h[rnk[s]] = true;
  989. }
  990. }
  991. for (int j = i; j < nxt[i]; ++j)
  992. {
  993. int s = pos[j] - h;
  994. if (s >= 0 && b2h[rnk[s]]){
  995. for (int k = rnk[s]+1; !bh[k] && b2h[k]; k++)
  996. {
  997. b2h[k] = false;
  998. }
  999. }
  1000. }
  1001. }
  1002. for (int i=0; i<n; ++i)
  1003. {
  1004. pos[rnk[i]] = i;
  1005. bh[i] = (bh[i] || b2h[i]);
  1006. }
  1007. }
  1008. for (int i=0; i<n; ++i)
  1009. {
  1010. rnk[pos[i]] = i;
  1011. }
  1012. }
  1013.  
  1014. vi rank;
  1015. vi lcp;
  1016.  
  1017. void reset()
  1018. {
  1019. rnk.clear(); pos.clear(); bh.clear(); b2h.clear(); cnt.clear(); nxt.clear(); rank.clear(); lcp.clear();
  1020. }
  1021. // - lcp[i] = length of the longest common prefix of suffix
  1022. // pos[i] and suffix pos[i-1]
  1023. // - lcp[0] = 0
  1024. void buildLCP(string &s)
  1025. {
  1026. int n = s.length();
  1027. lcp.assign(n+1,0);
  1028. for (int i=0; i<n; ++i) rnk[pos[i]] = i;
  1029. lcp[0] = 0;
  1030. for (int i=0, h=0; i<n; ++i)
  1031. {
  1032. if (rnk[i] > 0)
  1033. {
  1034. int j = pos[rnk[i]-1];
  1035. while (i + h < n && j + h < n && s[i+h] == s[j+h])
  1036. {
  1037. h++;
  1038. }
  1039. lcp[rnk[i]] = h;
  1040. if (h > 0) h--;
  1041. }
  1042. }
  1043. }
  1044. };
  1045.  
  1046. //Neural Network
  1047. //I actually did some ML stuff *coughs*
  1048.  
  1049. int main()
  1050. {
  1051. ios_base::sync_with_stdio(0); cin.tie(0);
  1052.  
  1053. }
Advertisement
Add Comment
Please, Sign In to add comment