zoukankan      html  css  js  c++  java
  • 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)<<" ";;
        
    }
  • 相关阅读:
    SPI简述
    stm32和sd卡
    BKP和RTC
    Lwip与底层的接口
    关于Ad-hoc
    stm32 引脚映射 和 ADC
    GDB使用总结
    linux管道和重定向
    学习python的第四天
    学习pyton的第三天
  • 原文地址:https://www.cnblogs.com/xcwang/p/11676314.html
Copyright © 2011-2022 走看看