Advertisement
RaFiN_

aho - corasick

Mar 21st, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1.  
  2.  
  3. string str;string s[MAX];int n,len,exist[MAX];
  4.  
  5. struct trie{
  6.  
  7.   trie *next[280];
  8.   trie *suff;
  9.   trie *output;
  10.   int vis;
  11.   int pt;
  12.   vector<trie *>vec;
  13.   trie(){
  14.     for(int i = 0;i<270;i++){
  15.  
  16.         next[i] = NULL;
  17.     }
  18.     vec.clear();
  19.     suff = NULL;
  20.     output = NULL;
  21.     pt = 0;vis = 0;
  22.   }
  23.  
  24.  
  25.   ~trie() {
  26.         for (int i=0; i<270; i++) {
  27.             if (next[i] != NULL && next[i] != this)
  28.             {
  29.                 delete next[i];
  30.             }
  31.         }
  32.     }
  33. }*root;
  34.  
  35. void Insert(string t,int pos){
  36.     trie *curr = root;
  37.     for(int i = 0;i<(int)t.length();i++){
  38.  
  39.         int id = t[i] - '0' + 10;
  40.         if(curr->next[id]==NULL){
  41.  
  42.             curr->next[id] = new trie();
  43.         }
  44.         curr = curr->next[id];
  45.  
  46.     }
  47. }
  48.  
  49. void failure(){
  50.     queue<trie *>q;
  51.     q.push(root);
  52.     while(!q.empty()){
  53.         trie *curr = q.front();
  54.         q.pop();
  55.         for(int c = 0;c<270;c++){
  56.             int id = c;
  57.             if(curr->next[id]){
  58.  
  59.                 if(curr==root){
  60.  
  61.                     curr->next[id]->suff = root;
  62.                 }
  63.                 else {
  64.                     trie *tmp = curr;
  65.                     while(tmp->suff!=NULL){
  66.  
  67.                         if(tmp->suff->next[id]){
  68.  
  69.                             curr->next[id]->suff = tmp->suff->next[id];
  70.                             curr->next[id]->suff->vec.pb(curr->next[id]);
  71.                             break;
  72.                         }
  73.                         tmp = tmp->suff;
  74.                     }
  75.                     if(tmp->suff==NULL)curr->next[id]->suff = root;
  76.  
  77.                 }
  78.  
  79.                 q.push(curr->next[id]);
  80.  
  81.             }
  82.         }
  83.     }
  84. }
  85.  
  86. void dfs(trie *curr){
  87.  
  88.     if(curr->vis||curr==root||!curr)return ;
  89.     curr->vis = 1;
  90.     for(int i = 0;i<(int)curr->vec.size();i++){
  91.  
  92.         dfs(curr->vec[i]);
  93.         if(curr->vec[i])
  94.         curr->pt+=curr->vec[i]->pt;
  95.     }
  96.  
  97.  
  98. }
  99.  
  100. void Search(){
  101.     int indx = 0;
  102.     trie *curr = root;
  103.     while(indx<len){
  104.         int id = str[indx] - '0' + 10;
  105.         while(curr!=root&&curr->next[id]==NULL)curr = curr->suff;
  106.         if(curr->next[id]){
  107.             curr = curr->next[id];
  108.             curr->pt++;
  109.         }
  110.  
  111.         indx++;
  112.     }
  113. }
  114.  
  115.  
  116. int main()
  117. {
  118.    /// booster()
  119.     ///read("input.txt");
  120.  
  121.  
  122.     root = new trie();
  123.  
  124.  
  125.     cin>>n;
  126.     for(int i = 0;i<n;i++){
  127.  
  128.         cin>>s[i];
  129.         Insert(s[i],i);
  130.     }
  131. //        printf("%s\n",str);
  132. //        for(int i = 0;i<n;i++)printf("%s\n",s[i]);
  133.     failure();
  134.     int w;
  135.     cin>>w;
  136.     for(int i = 0;i<w;i++)
  137.     {
  138.         cin>>str;
  139.         len = str.length();
  140.         Search();
  141.     }
  142.  
  143.     for(int i = 0;i<n;i++){
  144.  
  145.         int len2 = s[i].length();
  146.         trie *curr = root;
  147.         for(int j = 0;j<len2;j++){
  148.             int id = s[i][j] - '0' +10;
  149.             if(curr->next[id])
  150.             curr = curr->next[id];
  151.  
  152.         }
  153.         trie *cur = curr;
  154.         if(curr){
  155.  
  156.             dfs(curr);
  157.             exist[i]+=cur->pt;
  158.         }
  159.  
  160.     }
  161.  
  162.  
  163.     for(int i = 0;i<n;i++){
  164.         cout<<exist[i]<<endl;
  165.     }
  166.  
  167.     delete root;
  168.  
  169.  
  170.  
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement