• HDU2222 AC自动机模板


    直接统计答案,要是统计相同个数呢?不清零即可。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct node
     4 {
     5     int v[26],f,s;
     6 }t[500005];
     7 int T,n,cnt,rt;
     8 queue<int>q;
     9 char s[1000005];
    10 void build()
    11 {
    12     int l=strlen(s);int now=0;
    13     for(int i=0;i<l;++i)
    14     {
    15         if(t[now].v[s[i]-'a']){
    16             now=t[now].v[s[i]-'a'];
    17         }
    18         else{
    19             now=t[now].v[s[i]-'a']=++cnt;
    20         }
    21     }
    22     t[now].s++;
    23 }
    24 void init()
    25 {
    26     for(int i=0;i<=cnt;++i)
    27     {
    28         for(int j=0;j<26;++j)t[i].v[j]=0;
    29         t[i].f=t[i].s=0;
    30     }
    31     cnt=0;
    32 }
    33 void getfail()
    34 {
    35     for(int i=0;i<26;++i)
    36     {
    37         if(t[rt].v[i])q.push(t[rt].v[i]),t[t[rt].v[i]].f=0;
    38     }
    39     while(!q.empty())
    40     {
    41         int x=q.front();q.pop();
    42         for(int i=0;i<26;++i)
    43         {
    44             if(t[x].v[i]){
    45                 q.push(t[x].v[i]);
    46                 t[t[x].v[i]].f=t[t[x].f].v[i];
    47             }
    48             else{
    49                 t[x].v[i]=t[t[x].f].v[i];
    50             }
    51         }
    52     }
    53 }
    54 void work()
    55 {
    56     int ans=0;int l=strlen(s);int now=0;
    57     for(int i=0;i<l;++i)
    58     {
    59         now=t[now].v[s[i]-'a'];
    60         int p=now;
    61         while(p)
    62         {
    63             if(t[p].s<0)break;
    64             ans+=t[p].s;
    65             t[p].s=-1;
    66             p=t[p].f;
    67         }
    68     }
    69     printf("%d
    ",ans);
    70     return;
    71 }
    72 int main()
    73 {
    74     scanf("%d",&T);
    75     while(T--)
    76     {
    77         scanf("%d",&n);
    78         init();
    79         for(int i=1;i<=n;++i)
    80         {
    81             scanf("%s",s);
    82             build();
    83         }
    84         scanf("%s",s);
    85         getfail();
    86         work();
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    表达式的计算
    树、森林、与二叉树的转换
    线索二叉树
    表达式树
    js正则表达式处理表单
    kmp匹配算法
    SQL练习题
    ajax添加header信息
    mvc中webapi添加后没法访问 解决办法
    mysql修改表引擎Engine
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8327486.html
Copyright © 2020-2023  润新知