Live2D

AC自动机【模板】

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
struct jhh
{
 int fail;
 int vis[26];
 int end; 
}a[100001];
int cnt=0;
void build(string s)
{
    int l=s.length();
    int now=0;
    for(int i=0;i<l;++i)
    {
        if(a[now].vis[s[i]-'a']==0)
         {
          a[now].vis[s[i]-'a']=++cnt;
          now=a[now].vis[s[i]-'a'];
         }
    }
    a[now].end+=1;
}
void gf()
{
    queue<int>q;
    for(int i=0;i<26;++i)
     {
         if(a[0].vis[i]!=0)
          {
              a[a[0].vis[i]].fail=0;
               q.push(a[0].vis[i]);
         }
     }
     while(!q.empty())
     {
         int u=q.front();
         q.pop();
         for(int i=0;i<26;i++)
          {
              if(a[u].vis[i]!=0)
               {
                   a[a[u].vis[i]].fail=a[a[u].fail].vis[i];
                   q.push(a[u].vis[i]);
             }
            else
                      a[u].vis[i]=a[a[u].fail].vis[i];
         }
     }
}
int aq(string s)
{
    int l=s.length();
    int now=0,ans=0;
    for(int i=0;i<l;++i)
    {
        now=a[now].vis[s[i]-'a'];
        for(int t=now;t&&a[t].end!=-1;t=a[t].fail)
         {
          ans+=a[t].end;
          a[t].end=-1;
         }
    }
    return ans;
}
int main()
{
    while(cin>>n)
    {
     if(n==0) break;
     for(int i=1;i<=n;i++)
      {
          cin>>s;
          build(s);
      } 
    }
    a[0].fail=0;
    gf();
    cin>>s;
    cout<<aq(s)<<" ";;
    
}

 

posted @ 2019-10-15 10:56  'Jack'  阅读(140)  评论(0编辑  收藏  举报