• ac自动机


    代码:

    #include <bits/stdc++.h>
    using namespace std;
    char s[1000009];
    #define maxn 500010
    int c[maxn][26],val[maxn],fail[maxn],cnt;
    void insert(char s[1000009])
    {
      int len=strlen(s),now=0;
      for (int i=0;i<len;i++)
      {
        int v=s[i]-'a';
        if (!c[now][v]) c[now][v]=++cnt;
        now=c[now][v];
      }
      val[now]++;
    }
    queue<int> q; 
    void build()
    {
      for (int i=0;i<26;i++)
        if (c[0][i]) fail[c[0][i]]=0,q.push(c[0][i]);
      while (!q.empty())
      {
        int u=q.front(); q.pop();
        for (int i=0;i<26;i++)
          if (c[u][i])
          {
              fail[c[u][i]]=c[fail[u]][i];
              q.push(c[u][i]);
          }  else c[u][i]=c[fail[u]][i];
      }  
    }
    int query(char s[1000009])
    {
      int len=strlen(s),now=0,ans=0;
      for (int i=0;i<len;i++)
      {
        now=c[now][s[i]-'a'];
        for (int t=now;t&&val[t]!=-1;t=fail[t])
        {
          ans+=val[t]; val[t]=-1;
        }
      } 
      return ans;
    } 
    int main()
    {
      freopen("noip.in","r",stdin);
      freopen("noip.out","w",stdout);
      int n;
      cin>>n;
      for (int i=1;i<=n;i++)
      {
        cin>>s;
        insert(s);
      }
      build();
      cin>>s;
      cout<<query(s);
      return 0;
    }
    #include <bits/stdc++.h>
    using namespace std;
    char s[1000009];
    #define maxn 500000
    char jl[200][2000];
    int c[maxn][26],val[maxn],fail[maxn],cnt,f[maxn];
    vector<int>ff[maxn];
    void insert(char s[1000009],int x)
    {
      int len=strlen(s),now=0;
      for (int i=0;i<len;i++)
      {
        int v=s[i]-'a';
        if (!c[now][v]) c[now][v]=++cnt;
        now=c[now][v];
      }
      ff[now].push_back(x); val[now]++;
    }
    queue<int> q; 
    void build()
    {
      for (int i=0;i<26;i++)
        if (c[0][i]) fail[c[0][i]]=0,q.push(c[0][i]);
      while (!q.empty())
      {
        int u=q.front(); q.pop();
        for (int i=0;i<26;i++)
          if (c[u][i])
          {
              fail[c[u][i]]=c[fail[u]][i];
              q.push(c[u][i]);
          }  else c[u][i]=c[fail[u]][i];
      }  
    }
    int query(char s[1000009])
    {
      int len=strlen(s),now=0,ans=0;
      for (int i=0;i<len;i++)
      {
        now=c[now][s[i]-'a'];
        for (int t=now;t&&val[t]!=-1;t=fail[t])
        {
          for (int i=val[t];i>=1;i--) f[ff[t][i-1]]++;
        }
      } 
      return ans;
    } 
    int main()
    {
      freopen("noip.in","r",stdin);
      freopen("noip.out","w",stdout);
      int n;
      while (cin>>n&&n)
      {
        memset(c,0,sizeof(c));
        memset(f,0,sizeof(f));
        memset(val,0,sizeof(val));
        for (int i=0;i<=maxn-1;i++) ff[i].clear();
        for (int i=1;i<=n;i++)
        {
          cin>>s;
          for (int j=0;j<=1800;j++) jl[i][j]=s[j];
          insert(s,i);
        }
        build();
        cin>>s;
        query(s);
        int maxa=0;
        for (int i=1;i<=n;i++) maxa=max(maxa,f[i]);
        cout<<maxa<<endl;
        for (int i=1;i<=n;i++)
          if (f[i]==maxa)
            cout<<jl[i]<<endl;
      }
      return 0;
    }

    洛谷的两道模板题

    ac自动机基本只要在模板上做修改就好了

  • 相关阅读:
    【转】关于维生素的那些事
    【转】MaBatis学习---源码分析MyBatis缓存原理
    【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比
    【转】Java学习---垃圾回收算法与 JVM 垃圾回收器综述
    Qt 中的对象模型(Object Model)
    The Property System
    Qt--core模块概述
    QtCore概述
    在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)
    同一个进程的多个线程堆栈共享状况
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8453125.html
Copyright © 2020-2023  润新知