zoukankan      html  css  js  c++  java
  • AC自动机

    HDU 2222 模板题

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <queue>
     6 using namespace std;
     7 const int Maxn=1001000;
     8 int n,Kase,sz;
     9 char str[Maxn];
    10 int son[Maxn][30],Fail[Maxn],Word[Maxn];
    11 bool vis[Maxn];
    12 queue<int> Q;
    13 inline void Init()
    14 {
    15     memset(son,0,sizeof(son));
    16     sz=1; for (int i=1;i<=26;i++) son[0][i]=1;
    17     memset(Fail,0,sizeof(Fail));
    18     memset(Word,0,sizeof(Word));
    19     memset(vis,false,sizeof(vis));
    20 }
    21 inline void Insert(char * S)
    22 {
    23     int len=strlen(S+1),pos=1;
    24     for (int i=1;i<=len;i++)
    25     {
    26         int t=S[i]-'a'+1;
    27         if (son[pos][t]) pos=son[pos][t]; else pos=son[pos][t]=++sz;
    28     }
    29     Word[pos]++;
    30 }
    31 inline void Make()
    32 {
    33     Q.push(1); Fail[1]=0;
    34     while (!Q.empty())
    35     {
    36         int u=Q.front(); Q.pop();
    37         for (int i=1;i<=26;i++)
    38             if (son[u][i])
    39             {
    40                 int k=Fail[u];
    41                 while (!son[k][i]) k=Fail[k];
    42                 Fail[son[u][i]]=son[k][i];
    43                 Q.push(son[u][i]);
    44             }
    45     }
    46 }
    47 inline int Solve()
    48 {
    49     int len=strlen(str+1),pos=1,Ans=0;
    50     for (int i=1;i<=len;i++)
    51     {
    52         vis[pos]=true;
    53         int t=str[i]-'a'+1;
    54         while (!son[pos][t]) pos=Fail[pos];
    55         pos=son[pos][t];
    56         if (!vis[pos])
    57             for (int j=pos;j;j=Fail[j])
    58             {
    59                 Ans+=Word[j];
    60                 Word[j]=0;
    61             }
    62     }
    63     return Ans;
    64 }
    65 int main()
    66 {
    67     scanf("%d",&Kase);
    68     for (int kase=1;kase<=Kase;kase++)
    69     {
    70         scanf("%d",&n);  Init();
    71         for (int i=1;i<=n;i++)
    72         {
    73             scanf("%s",str+1);
    74             Insert(str);
    75         }
    76         Make();
    77         scanf("%s",str+1);
    78         printf("%d
    ",Solve());
    79     }
    80     return 0;
    81 }
    C++
  • 相关阅读:
    DAY 118 ES组合查询
    DAY 117 ES查询
    DAY 116 ES文档操作
    box_sizing
    添加视频
    网页自动刷新
    如何使网页宽度自动适应手机屏幕的宽度?
    存储过程&触发器
    mysql事务
    mysql常用语句
  • 原文地址:https://www.cnblogs.com/yyjxx2010xyu/p/5524761.html
Copyright © 2011-2022 走看看