Advertisement
tien_noob

Aho Corasick

May 13th, 2022
444
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. //Make CSP great again
  2. //Vengeance
  3. #include <bits/stdc++.h>
  4. #define TASK "TESTCODE"
  5. #define Log2(x) 31 - __builtin_clz(x)
  6. using namespace std;
  7. struct aho_corasick
  8. {
  9.     struct node
  10.     {
  11.         int nxt[26], go[26], link, val;
  12.         node()
  13.         {
  14.             memset(nxt, -1, sizeof(nxt));
  15.             memset(go, 0, sizeof(nxt));
  16.             link = val = 0;
  17.         }
  18.     };
  19.     vector<node> tree;
  20.     void new_node()
  21.     {
  22.         node tmp;
  23.         tree.push_back(tmp);
  24.     }
  25.     void reset()
  26.     {
  27.         tree.clear();
  28.         new_node();
  29.     }
  30.     void add(string &s, int val)
  31.     {
  32.         int id = 0;
  33.         for (char &c : s)
  34.         {
  35.             int w = c - 'a';
  36.             if (tree[id].nxt[w] == -1)
  37.             {
  38.                 tree[id].nxt[w] = tree.size();
  39.                 new_node();
  40.             }
  41.             id = tree[id].nxt[w];
  42.         }
  43.         tree[id].val += val;
  44.     }
  45.     void build()
  46.     {
  47.         queue<int> q;
  48.         q.push(0);
  49.         while(!q.empty())
  50.         {
  51.             int u = q.front();
  52.             q.pop();
  53.             tree[u].val += tree[tree[u].link].val;
  54.             for (int w = 0; w < 26; ++ w)
  55.             {
  56.                 int v = tree[u].nxt[w];
  57.                 if (v != -1)
  58.                 {
  59.                     tree[u].go[w] = v;
  60.                     if (u != 0)
  61.                     {
  62.                         tree[v].link = tree[tree[u].link].go[w];
  63.                     }
  64.                     else
  65.                     {
  66.                         tree[v].link = 0;
  67.                     }
  68.                     q.push(v);
  69.                 }
  70.                 else
  71.                 {
  72.                     tree[u].go[w] = tree[tree[u].link].go[w];
  73.                 }
  74.             }
  75.         }
  76.     }
  77.     long long get(string s)
  78.     {
  79.         long long ret = 0;
  80.         int u = 0;
  81.         for (char &c : s)
  82.         {
  83.             u = tree[u].go[c - 'a'];
  84.             ret += tree[u].val;
  85.         }
  86.         return ret;
  87.     }
  88. } tree;
  89. string a, b;
  90. void read()
  91. {
  92.     tree.reset();
  93.     cin >> a >> b;
  94.     int n;
  95.     cin >> n;
  96.     for (int i = 1; i <= n; ++ i)
  97.     {
  98.         string s;
  99.         int val;
  100.         cin >> s >> val;
  101.         tree.add(s, val);
  102.     }
  103.     tree.build();
  104. }
  105. void solve()
  106. {
  107.  
  108. }
  109. int main()
  110. {
  111.     ios_base::sync_with_stdio(false);
  112.     cin.tie(nullptr);
  113.     if (fopen(TASK".INP", "r"))
  114.     {
  115.         freopen(TASK".INP", "r", stdin);
  116.         //freopen(TASK".OUT", "w", stdout);
  117.     }
  118.     int t = 1;
  119.     bool typetest = true;
  120.     if (typetest)
  121.     {
  122.         cin >> t;
  123.     }
  124.     for (int __ = 1; __ <= t; ++ __)
  125.     {
  126.         //cout << "Case " << __ << ": ";
  127.         read();
  128.         solve();
  129.     }
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement