ac自动机模板

指针版写法:

  1. struct node  
  2. {  
  3.     int val;  
  4.     node *next[26];  
  5.     node *fail;  
  6.     node()  
  7.     {  
  8.         val = 0;  
  9.         for(int i = 0; i < 26; i++)  
  10.             next[i] = NULL;  
  11.         fail = NULL;  
  12.     }  
  13. };  
  14. node *root;  
  15.   
  16. void insert(char *s)  
  17. {  
  18.     int n = strlen(s);  
  19.     node *curr = root;  
  20.     for(int i = 0; i < n; i++)  
  21.     {  
  22.         int c = s[i] - 'a';  
  23.         if(curr->next[c] == NULL)  
  24.         {  
  25.             node *newnode = new node;  
  26.             curr->next[c] = newnode;  
  27.         }  
  28.         curr = curr->next[c];  
  29.           
  30.     }  
  31.     curr->val++;  
  32. }  
  33.   
  34. void build()  
  35. {  
  36.     root->fail = NULL;  
  37.     queue <node*> Q;  
  38.     Q.push(root);  
  39.     while(!Q.empty())  
  40.     {  
  41.           
  42.         node *temp = Q.front();  
  43.         node *p = NULL;  
  44.         Q.pop();  
  45.         for(int i = 0; i < 26; i++)  
  46.         {  
  47.             if(temp->next[i] == NULL)  
  48.                 continue;  
  49.             if(temp == root)  
  50.                 temp->next[i]->fail = root;  
  51.             else  
  52.             {  
  53.                 p = temp->fail;  
  54.                 while(p != NULL)  
  55.                 {  
  56.                     if(p->next[i] != NULL)  
  57.                     {  
  58.                         temp->next[i]->fail = p->next[i];  
  59.                         break;  
  60.                     }  
  61.                     p = p->fail;  
  62.                 }  
  63.                 if(p == NULL)  
  64.                     temp->next[i]->fail = root;  
  65.             }  
  66.             Q.push(temp->next[i]);  
  67.         }  
  68.     }  
  69. }  
  70. void find(char *s)  
  71. {  
  72.     int n = strlen(s);  
  73.     node *p = root;  
  74.     for(int i = 0; i < n; i++)  
  75.     {  
  76.         int c = s[i] - 'a';  
  77.         while(p != root && p->next[c] == NULL)  
  78.             p = p->fail;  
  79.         p = p->next[c];  
  80.         if(p == NULL)  
  81.             p = root;  
  82.         node *temp = p;  
  83.         while(temp != root)  
  84.         {  
  85.             ans += temp->val;  
  86.             temp->val = 0;  
  87.             temp = temp->fail;  
  88.         }  
  89.     }  
  90. }  
  91.   
  92. void del(node *p)  
  93. {  
  94.     for(int i = 0; i < 26; i++)  
  95.     {  
  96.         if(p->next[i] != NULL)  
  97.             del(p->next[i]);  
  98.     }  
  99.     free(p);  
  100. }  
数组版写法
  1. const int maxnode = 500*210;  
  2. const int size = 128;  
  3. int ch[maxnode][size];  
  4. int val[maxnode];  
  5. int f[maxnode];  
  6. int sz;  
  7. bool id[maxn];  
  8. void init()  
  9. {  
  10.     sz = 1;  
  11.     memset(ch[0], 0, sizeof(ch[0]));  
  12. }  
  13. void insert(char *s, int v)  
  14. {  
  15.     int u = 0n = strlen(s);  
  16.     for(int i = 0; i < n; i++)  
  17.     {  
  18.         int c = s[i];  
  19.         if(!ch[u][c])  
  20.         {  
  21.             memset(ch[sz], 0, sizeof(ch[sz]));  
  22.             val[sz] = 0;  
  23.             ch[u][c] = sz++;  
  24.         }  
  25.         u = ch[u][c];  
  26.     }  
  27.     val[u] = v;  
  28. }  
  29. void getFail()  
  30. {  
  31.     queue <int> q;  
  32.     f[0] = 0;  
  33.     for(int c = 0; c < size; c++)  
  34.     {  
  35.         int u = ch[0][c];  
  36.         if(u)  
  37.         {  
  38.             f[u] = 0;  
  39.             q.push(u);  
  40.         }  
  41.     }  
  42.     while(!q.empty())  
  43.     {  
  44.         int r = q.front(); q.pop();  
  45.           
  46.         for(int c = 0; c < size; c++)  
  47.         {  
  48.             int u = ch[r][c];  
  49.             if(!u)  
  50.             {  
  51.                 ch[r][c] = ch[f[r]][c];  
  52.                 continue;  
  53.             }  
  54.             q.push(u);  
  55.             f[u] = ch[f[r]][c];  
  56.         }  
  57.     }  
  58. }  
  59.   
  60. void find(char *s, int num)  
  61. {  
  62.     int n = strlen(s);  
  63.     int j = 0;  
  64.     for(int i = 0; i < n; i++)  
  65.     {  
  66.         j = ch[j][s[i]];  
  67.         int temp = j;  
  68.         while(temp)  
  69.         {  
  70.             if(val[temp] > 0)  
  71.             {  
  72.                 ;  
  73.             }  
  74.             temp = f[temp];  
  75.         }  
  76.     }  
  77. }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值