Advertisement
RaFiN_

untested aho-corasick

Mar 23rd, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1.  
  2. char str[MAX];char s[2005];int n,len,exist[1005];
  3.  
  4. struct trie{
  5.  
  6.   trie *next[130];
  7.   trie *suff;
  8.   vector<int>vec;
  9.   trie(){
  10.     for(int i = 0;i<130;i++){
  11.  
  12.         next[i] = NULL;
  13.     }
  14.     vec.clear();
  15.     suff = NULL;
  16.   }
  17. }*root;
  18.  
  19. void Insert(string t,int pos){
  20.     trie *curr = root;
  21.     for(int i = 0;i<t.length();i++){
  22.  
  23.         int id = t[i] - 32;
  24.         if(curr->next[id]==NULL){
  25.  
  26.             curr->next[id] = new trie();
  27.         }
  28.         curr = curr->next[id];
  29.  
  30.     }
  31.     curr->vec.pb(pos);
  32. }
  33.  
  34. void propagate(trie *curr){
  35.  
  36.     if(curr==root)return ;
  37.     for(int i = 0;i<(int)curr->suff->vec.size();i++){
  38.  
  39.         curr->vec.pb(curr->suff->vec[i]);
  40.     }
  41.  
  42. }
  43.  
  44. void failure(){
  45.     queue<trie *>q;
  46.     q.push(root);
  47.     while(!q.empty()){
  48.         trie *curr = q.front();
  49.         q.pop();
  50.         for(int c = 0;c<100;c++){
  51.             int id = c;
  52.             if(curr->next[id]){
  53.  
  54.                 if(curr==root){
  55.  
  56.                     curr->next[id]->suff = root;
  57.                 }
  58.                 else {
  59.                     trie *tmp = curr;
  60.                     while(tmp->suff!=NULL){
  61.  
  62.                         if(tmp->suff->next[id]){
  63.  
  64.                             curr->next[id]->suff = tmp->suff->next[id];
  65.                             break;
  66.                         }
  67.                         tmp = tmp->suff;
  68.                     }
  69.                     if(tmp->suff==NULL)curr->next[id]->suff = root;
  70.  
  71.                 }
  72.                 propagate(curr->next[id]);
  73.                 q.push(curr->next[id]);
  74.  
  75.             }
  76.         }
  77.     }
  78. }
  79.  
  80. void Search(){
  81.     int indx = 0;
  82.     trie *curr = root;
  83.     while(indx<len){
  84.  
  85.         int id = str[indx] -32;
  86.         while(curr!=root&&curr->next[id]==NULL)curr = curr->suff;
  87.         if(curr->next[id]){
  88.             curr = curr->next[id];
  89.             trie *tmp = curr;
  90.  
  91.             if(tmp!=root&&(int)tmp->vec.size()){
  92.  
  93.                 for(int i = 0;i<(int)tmp->vec.size();i++){
  94.  
  95.                     exist[tmp->vec[i]] ++;
  96.                 }
  97.             }
  98.  
  99.         }
  100.         indx++;
  101.     }
  102.  
  103. }
  104.  
  105.  
  106. int main()
  107. {
  108.     booster()
  109.     ///read("input.txt");
  110.  
  111.     while(scanf("%s",str)!=EOF)
  112.     {
  113.         root = new trie();
  114.         mem(exist,0);
  115.         len = strlen(str);
  116.         scani(n);
  117.         for(int i = 0;i<n;i++){
  118.  
  119.             scanf(" %s",s);
  120.             Insert(s,i);
  121.         }
  122. //        printf("%s\n",str);
  123. //        for(int i = 0;i<n;i++)printf("%s\n",s[i]);
  124.         failure();
  125.  
  126.         Search();
  127.         for(int i = 0;i<n;i++){
  128.             if(exist[i])printf("Y\n");
  129.             else printf("N\n");
  130.  
  131.         }
  132.     }
  133.  
  134.  
  135.     return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement