zoukankan      html  css  js  c++  java
  • [模板系列] AC自动姬

    题目链接:https://www.luogu.org/problemnew/show/P3808

      1 #include "bits/stdc++.h"
      2 using namespace std;
      3 typedef long long LL;
      4 const int MAX1=1e6+5,MAX2=5e5+5;
      5 int n;char s[MAX1];
      6 struct Aho{
      7     struct state{
      8         int next[27];
      9         int fail,cnt;
     10     }sst[MAX1];
     11     
     12     int size;
     13     queue <int> q;
     14     
     15     void init(){
     16         int i,j;
     17         while (!q.empty()) q.pop();
     18         for (i=0;i<MAX2;i++){
     19             memset(sst[i].next,0,sizeof(sst[i].next));
     20             sst[i].fail=sst[i].cnt=0;
     21         }
     22         size=0;
     23     }
     24     
     25     void insert(char *s){
     26         int i,j,ls=strlen(s);
     27         int now=0;char c;
     28         for (i=0;i<ls;i++){
     29             c=s[i];
     30             if (!sst[now].next[c-'a']) sst[now].next[c-'a']=++size;
     31             now=sst[now].next[c-'a'];
     32         }
     33         sst[now].cnt++;
     34     }
     35     
     36     void build(){
     37         int i,j;
     38         q.push(0);sst[0].fail=-1;
     39         while (!q.empty()){
     40             int u=q.front();q.pop();
     41             for (i=0;i<26;i++)
     42                 if (sst[u].next[i]){
     43                     if (u==0) sst[sst[u].next[i]].fail=0;
     44                     else{
     45                         int v=sst[u].fail;
     46                         while (v!=-1){
     47                             if (sst[v].next[i]){
     48                                 sst[sst[u].next[i]].fail=sst[v].next[i];
     49                                 break;
     50                             }
     51                             v=sst[v].fail;
     52                         }
     53                         if (v==-1) sst[sst[u].next[i]].fail=0;
     54                     }
     55                     q.push(sst[u].next[i]);
     56                 }
     57         }
     58     }
     59     
     60     int get(int u){
     61         int an=0;
     62         while (u){
     63             an+=sst[u].cnt;
     64             sst[u].cnt=0;
     65             u=sst[u].fail;
     66         }
     67         return an;
     68     }
     69     
     70     int match(char *s){
     71         int i,j,ls=strlen(s);
     72         int now=0,cnt=0;
     73         for (i=0;i<ls;i++){
     74             char c=s[i];
     75             if (sst[now].next[c-'a']) now=sst[now].next[c-'a'];
     76             else{
     77                 int p=sst[now].fail;
     78                 while (p!=-1 && sst[p].next[c-'a']==0) p=sst[p].fail;
     79                 if (p==-1) now=0;
     80                 else now=sst[p].next[c-'a'];
     81             }
     82             if (sst[now].cnt)
     83                 cnt+=get(now);
     84         }
     85         return cnt;
     86     }
     87 }aho;
     88 int main(){
     89     freopen ("aho.in","r",stdin);freopen ("aho.out","w",stdout);
     90     int i,j;
     91     aho.init();
     92     scanf("%d
    ",&n);
     93     for (i=1;i<=n;i++){
     94         scanf("%s",s);
     95         aho.insert(s);
     96     }
     97     aho.build();
     98     scanf("%s",s);
     99     printf("%d",aho.match(s));
    100     return 0;
    101 }
  • 相关阅读:
    vscode 前端好用插件汇总
    IE8和IE9下textarea滚动选中的问题
    javascript实现数字整数位每三位一个逗号分隔
    简单枚举(算法竞赛入门经典)
    拓扑排序(算法竞赛入门经典)
    七桥问题--欧拉(算法竞赛入门经典)
    走迷宫问题 算法竞赛入门经典
    ZOJ1008
    ZOJ1163
    HDU 1069 Monkey and Banana
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7797812.html
Copyright © 2011-2022 走看看