Tuesday, May 7, 2019

[Toph] Subset of Sequences

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : Subset of Sequences
Source            : Toph
Category          : Data Structure, String
Algorithm         : Trie using Map 
Verdict           : Accepted 

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. #define ll            long long int  
  6. #define vi            vector <int>  
  7.   
  8. static const int maxn = 2e6 + 5;  
  9. static const ll mod = 1e9 + 7;  
  10.   
  11. int n;  
  12. ll power[maxn], ans[maxn], length[maxn];  
  13.   
  14. struct Node  
  15. {  
  16.       ll ed;  
  17.       map <int, Node*> Next;  
  18.       Node()  
  19.       {  
  20.             ed = 0;  
  21.             Next.clear();  
  22.       }  
  23. };  
  24.   
  25. typedef Node*     pnode;  
  26. pnode root;  
  27.   
  28. void add(vi &vec)  
  29. {  
  30.       pnode cur = root;  
  31.       for (int val : vec)  
  32.       {  
  33.             if (cur->Next.find(val) == cur->Next.end()) cur->Next[val] = new Node;  
  34.             cur = cur->Next[val];  
  35.             cur->ed += 1;  
  36.       }  
  37. }  
  38.   
  39. void srch(vi &vec)  
  40. {  
  41.       pnode cur = root;  
  42.       int len = vec.size();  
  43.       for (int i = 0; i < len; i++)  
  44.       {  
  45.             int val = vec[i];  
  46.             if (cur->Next.find(val) == cur->Next.end()) return;  
  47.             cur = cur->Next[val];  
  48.             int cnt = cur->ed;  
  49.             ans[i+1] = (ans[i+1] + (power[cnt] - 1) % mod) % mod;  
  50.       }  
  51. }  
  52.   
  53. int main()  
  54. {  
  55.       ios_base::sync_with_stdio(false);  
  56.       cin.tie(nullptr);  
  57.       cout.tie(nullptr);  
  58.   
  59.       #ifndef ONLINE_JUDGE  
  60.             freopen("in.txt""r", stdin);  
  61.       #endif // ONLINE_JUDGE  
  62.   
  63.   
  64.       power[0] = 1;  
  65.       for (int i = 1; i < maxn; i++) power[i] = (2LL * power[i-1]) % mod;  
  66.   
  67.       int n;  
  68.       cin >> n;  
  69.       root = new Node;  
  70.       for (int i = 1; i <= n; i++)  
  71.       {  
  72.             int m;  
  73.             cin >> m;  
  74.             length[0]++;  
  75.             vector <int> vec(m);  
  76.             for (int i = 0; i < m; i++)  
  77.             {  
  78.                   length[i+1]++;  
  79.                   cin >> vec[i];  
  80.             }  
  81.             srch(vec);  
  82.             add(vec);  
  83.       }  
  84.       ans[0] = (power[ length[0] ] - 1 - length[0] + mod) % mod;  
  85.       int q;  
  86.       cin >> q;  
  87.       for (int tcase = 1; tcase <= q; tcase++)  
  88.       {  
  89.             int k;  
  90.             cin >> k;  
  91.             cout << "Case " << tcase << ": " << (ans[k] + length[k]) % mod << '\n';  
  92.       }  
  93. }  



No comments:

Post a Comment

Note: Only a member of this blog may post a comment.