Sunday, June 2, 2019

[Codeforces] F. String Set Queries

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : F. String Set Queries
Source            : Codeforces
Category          : String
Algorithm         : Aho Corasick Algorithm - Dynamic 
Verdict           : Accepted

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 3e5 + 5;  
  6. static const int logn = 20;  
  7.   
  8. struct AhoCorasick  
  9. {  
  10.       int sz, Num[maxn], backPoint[maxn];  
  11.       map <charint> Next[maxn];  
  12.   
  13.       void init()  
  14.       {  
  15.             assert(sz < maxn);  
  16.             for (int i = 0; i <= sz; i++)  
  17.             {  
  18.                   Num[i] = 0;  
  19.                   backPoint[i] = -1;  
  20.                   Next[i].clear();  
  21.             }  
  22.             sz = 0;  
  23.       }  
  24.       AhoCorasick()  
  25.       {  
  26.             init();  
  27.       }  
  28.       void insertPattern(const string &pat)  
  29.       {  
  30.             int v = 0;  
  31.             for (char ch : pat)  
  32.             {  
  33.                   if (Next[v].count(ch) == 0) Next[v][ch] = ++sz;  
  34.                   v = Next[v][ch];  
  35.             }  
  36.             Num[v]++;  
  37.       }  
  38.       void findBackPointer() // Build Failure Function  
  39.       {  
  40.             queue <int> PQ;  
  41.             PQ.emplace(0);  
  42.             int v = 0;  
  43.             while (!PQ.empty())  
  44.             {  
  45.                   int u = PQ.front(); PQ.pop();  
  46.                   for (auto it : Next[u])  
  47.                   {  
  48.                         int v = it.second;  
  49.                         char ch = it.first;  
  50.                         int w = backPoint[u];  
  51.                         while (w != -1 && Next[w].count(ch) == 0) w = backPoint[w];  
  52.                         if (w == -1) backPoint[v] = 0;  
  53.                         else backPoint[v] = Next[w][ch];  
  54.                         Num[v] += Num[ backPoint[v] ];  
  55.                         PQ.emplace(v);  
  56.                   }  
  57.             }  
  58.       }  
  59.       int insertTextAndQuery(const string &text)  
  60.       {  
  61.             int v = 0;  
  62.             int ans = 0;  
  63.             for (char ch : text)  
  64.             {  
  65.                   while (v != -1 && Next[v].count(ch) == 0) v = backPoint[v];  
  66.                   if (v == -1) v = 0;  
  67.                   else v = Next[v][ch];  
  68.                   ans += Num[v];  
  69.             }  
  70.             return ans;  
  71.       }  
  72. };  
  73.   
  74. struct AhoCorasickDynamic  
  75. {  
  76.       vector <string> lst[logn];  
  77.       AhoCorasick aho[logn];  
  78.   
  79.       void init()  
  80.       {  
  81.             for (int i = 0; i < logn; i++)  
  82.             {  
  83.                   lst[i].clear();  
  84.                   aho[i].init();  
  85.             }  
  86.       }  
  87.       AhoCorasickDynamic()  
  88.       {  
  89.             init();  
  90.       }  
  91.       void insertPattern(const string &pat)  
  92.       {  
  93.             int position = 0;  
  94.             for (int i = 0; i < logn; i++)  
  95.             {  
  96.                   if (lst[i].empty())  
  97.                   {  
  98.                         position = i;  
  99.                         break;  
  100.                   }  
  101.             }  
  102.             lst[position].emplace_back(pat);  
  103.             aho[position].insertPattern(pat);  
  104.             for (int i = 0; i < position; i++)  
  105.             {  
  106.                   aho[i].init();  
  107.                   for (string p : lst[i])  
  108.                   {  
  109.                         lst[position].emplace_back(p);  
  110.                         aho[position].insertPattern(p);  
  111.                   }  
  112.                   lst[i].clear();  
  113.             }  
  114.             aho[position].findBackPointer();  
  115.       }  
  116.       int query(const string &text)  
  117.       {  
  118.             int ans = 0;  
  119.             for (int i = 0; i < logn; i++) ans += aho[i].insertTextAndQuery(text);  
  120.             return ans;  
  121.       }  
  122. };  
  123.   
  124. AhoCorasickDynamic add;  
  125. AhoCorasickDynamic del;  
  126.   
  127. signed main()  
  128. {  
  129.       ios_base::sync_with_stdio(false);  
  130.       cin.tie(nullptr);  
  131.       cout.tie(nullptr);  
  132.       cout << fixed << setprecision(3);  
  133.   
  134.       #ifndef ONLINE_JUDGE  
  135.             freopen("in.txt""r", stdin);  
  136.       #endif // ONLINE_JUDGE  
  137.   
  138.       int n;  
  139.       cin >> n;  
  140.       int type;  
  141.       string s;  
  142.       for (int i = 0; i < n; i++)  
  143.       {  
  144.             cin >> type >> s;  
  145.             if (type == 1) add.insertPattern(s);  
  146.             else if (type == 2) del.insertPattern(s);  
  147.             else cout << (add.query(s) - del.query(s)) << endl;  
  148.       }  
  149.   
  150. }  

No comments:

Post a Comment

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