Guest User

Untitled

a guest
Dec 30th, 2016
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. //satyaki3794
  2. #include <bits/stdc++.h>
  3. #define ff first
  4. #define ss second
  5. #define pb push_back
  6. #define MOD (1000000007LL)
  7. #define LEFT(n) (2*(n))
  8. #define RIGHT(n) (2*(n)+1)
  9.  
  10. using namespace std;
  11. typedef long long ll;
  12. typedef pair<int, int> ii;
  13. typedef pair<int, ii> iii;
  14.  
  15. ll pwr(ll base, ll p, ll mod = MOD){
  16. ll ans = 1;while(p){if(p&1)ans=(ans*base)%mod;base=(base*base)%mod;p/=2;}return ans;
  17. }
  18.  
  19.  
  20. ll gcd(ll a, ll b){
  21. if(b == 0) return a;
  22. return gcd(b, a%b);
  23. }
  24.  
  25.  
  26.  
  27. const int N = 1000*1000+2;
  28. int n, sz, ticks, trie[N][26], BIT[N], subtree_l[N], subtree_r[N];
  29. int q, lo[100005], hi[100005], ans[100005];
  30. ll threshold[100005];
  31. vector<int> T, query_sets[100005], check[100005];
  32.  
  33.  
  34. void update(int idx, int val){
  35. while(idx <= ticks){
  36. BIT[idx] += val;
  37. idx += idx & (-idx);
  38. }
  39. }
  40.  
  41.  
  42. int query(int idx){
  43. int ans = 0;
  44. while(idx){
  45. ans += BIT[idx];
  46. idx -= idx & (-idx);
  47. }
  48. return ans;
  49. }
  50.  
  51.  
  52.  
  53. void insert(string str, vector<int> &v){
  54. int curr = 0;
  55. for(int i=0;i<(int)str.length();i++){
  56. int dir = str[i] - 'a';
  57. if(trie[curr][dir] == -1)
  58. trie[curr][dir] = ++sz;
  59. curr = trie[curr][dir];
  60. }
  61. v.pb(curr);
  62. }
  63.  
  64. void dfs(int v){
  65. subtree_l[v] = ++ticks;
  66. for(int dir=0;dir<26;dir++)
  67. if(trie[v][dir] != -1)
  68. dfs(trie[v][dir]);
  69. subtree_r[v] = ticks;
  70. }
  71.  
  72.  
  73. ll get_value_till(int z){
  74. memset(BIT, 0, sizeof(BIT));
  75. for(int i=1;i<=z;i++){
  76. int trie_node = T[i-1];
  77. update(subtree_l[trie_node], 1);
  78. update(subtree_r[trie_node]+1, -1);
  79. }
  80. ll ans = 0;
  81. for(auto node : query_sets[1])
  82. ans += query(subtree_l[node]);
  83. return ans;
  84. }
  85.  
  86.  
  87. int main(){
  88.  
  89. ios_base::sync_with_stdio(0);
  90. cin.tie(0);
  91.  
  92. // freopen("test6.in", "r", stdin);
  93. // freopen("test6.out", "w", stdout);
  94.  
  95. memset(trie, -1, sizeof(trie));
  96. sz = 0;
  97.  
  98. cin>>n;
  99. for(int i=1;i<=n;i++){
  100. string str;
  101. cin>>str;
  102. insert(str, T);
  103. }
  104.  
  105. cin>>q;
  106. for(int i=1;i<=q;i++){
  107. int z;
  108. cin>>z>>threshold[i];
  109. while(z--){
  110. string str;
  111. cin>>str;
  112. insert(str, query_sets[i]);
  113. }
  114. ans[i] = MOD;
  115. lo[i] = 1; hi[i] = n;
  116. }
  117.  
  118. dfs(0);
  119.  
  120.  
  121. // for(auto it : T) cout<<it<<" ";cout<<endl;
  122. // for(auto it : query_sets[1]) cout<<it<<" ";cout<<endl;
  123. // cout<<"subtree_l: ";for(int i=0;i<=sz;i++) cout<<subtree_l[i]<<" ";cout<<endl;
  124. // cout<<"subtree_r: ";for(int i=0;i<=sz;i++) cout<<subtree_r[i]<<" ";cout<<endl;
  125.  
  126. // cout<<threshold[1]<<endl;
  127. // cout<<get_value_till(225)<<endl;
  128. // cout<<get_value_till(226)<<endl;
  129. // cout<<get_value_till(14550)<<endl;
  130. // cout<<get_value_till(14551)<<endl;
  131.  
  132.  
  133. bool more_iterations = true;
  134. while(more_iterations){
  135.  
  136. more_iterations = false;
  137. memset(BIT, 0, (ticks+1)*sizeof(BIT[0]));
  138. for(int i=1;i<=n;i++)
  139. check[i].clear();
  140.  
  141. for(int i=1;i<=q;i++)
  142. if(lo[i] <= hi[i]){
  143. check[(lo[i]+hi[i])/2].pb(i);
  144. more_iterations = true;
  145. }
  146.  
  147. for(int i=1;i<=n;i++){
  148.  
  149. int trie_node = T[i-1];
  150. update(subtree_l[trie_node], 1);
  151. update(subtree_r[trie_node]+1, -1);
  152.  
  153. for(auto S : check[i]){
  154.  
  155. ll val = 0;
  156. for(auto node : query_sets[S]){
  157. val += query(subtree_l[node]);
  158. }
  159.  
  160. if(val >= threshold[S]){
  161. ans[S] = min(ans[S], i);
  162. hi[S] = i-1;
  163. }
  164. else{
  165. lo[S] = i+1;
  166. }
  167. }
  168. }
  169. }
  170.  
  171. for(int i=1;i<=q;i++){
  172. if(ans[i] == MOD) ans[i] = -1;
  173. cout<<ans[i]<<endl;
  174. }
  175.  
  176. return 0;
  177. }
Add Comment
Please, Sign In to add comment