Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.20 KB | None | 0 0
  1. struct Aho{
  2.     struct Vert{
  3.         int to[26], au[26];
  4.         int suf, p, c;
  5.         Vert() { for (int i = 0; i < 26; i++) to[i] = -1, au[i] = 0; suf = 0; }
  6.     };
  7.  
  8.     Vert t[200007];
  9.     int sz;
  10.  
  11.     Aho() { sz = 1; }
  12.  
  13.     int add(string &s){
  14.         int v = 0;
  15.         for (char c : s){
  16.             int now = c - 'a';
  17.             if (t[v].to[now] == -1) t[sz].p = v, t[sz].c = now, t[v].to[now] = sz++;
  18.             v = t[v].to[now];
  19.         }
  20.         return v;
  21.     }
  22.  
  23.     void buildSuf(){
  24.         vector<int> st;
  25.         int uk = 0;
  26.         st.push_back(0);
  27.         while(uk < st.size()){
  28.             int v = st[uk++];
  29.             if (v == 0 || t[v].p == 0) t[v].suf = 0;
  30.             else {
  31.                 int cur = t[t[v].p].suf;
  32.                 while(1){
  33.                     if (t[cur].to[t[v].c] != -1){
  34.                         t[v].suf = t[cur].to[t[v].c];
  35.                         break;
  36.                     }
  37.                     if (cur == 0) break;
  38.                     cur = t[cur].suf;
  39.                 }
  40.             }
  41.             for (int i = 0; i < 26; i++) if (t[v].to[i] != -1) st.pb(t[v].to[i]);
  42.         }
  43.     }
  44.  
  45.     void buildAu(){
  46.         vector<int> st;
  47.         int uk = 0;
  48.         st.push_back(0);
  49.         while(uk < st.size()){
  50.             int v = st[uk++];
  51.             for (int i = 0; i < 26; i++){
  52.                 if (t[v].to[i] != -1) t[v].au[i] = t[v].to[i];
  53.                 else { 
  54.                     t[v].au[i] = t[t[v].suf].au[i];
  55.                 }
  56.             }
  57.             for (int i = 0; i < 26; i++) if (t[v].to[i] != -1) st.pb(t[v].to[i]);
  58.         }
  59.     }
  60. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement