zoukankan      html  css  js  c++  java
  • 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自动机基本只要在模板上做修改就好了

  • 相关阅读:
    Sun:收购MySQL是现代软件史上最重要收购[ZT]
    SCI2012年收录的中文期刊
    Elsevier期刊投稿状态
    医学图像SCI
    贝叶斯法则,先验概率,后验概率,最大后验概率
    医学图像处理与分析方面的大牛
    2013 EI检索的国内期刊
    ICIP EMBC IUS 2013
    香港中文大学第六十九届颁授学位典礼 校长赠言 我默祷你们都能不负此生
    自动生成参考文献编号
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8453125.html
Copyright © 2011-2022 走看看