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自动机基本只要在模板上做修改就好了

原文地址:https://www.cnblogs.com/yinwuxiao/p/8453125.html