码迷,mamicode.com
首页 > 其他好文 > 详细

AC自动机

时间:2017-07-06 13:24:11      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:nbsp   init   ==   har   string   algo   eof   clu   ++   

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define L 51
#define LL 100000002
using namespace std;
char c[11][L],s[LL];
struct Trie
{
    Trie *ch[26],*fail,*last;
    int who;
    Trie()
    {
       memset(ch,0,sizeof(ch));
       fail=NULL;
       last=NULL;
       who=0;
    }
    void* operator new(size_t size);
}*root,*C,*mempool,*q[L*11];
void* Trie :: operator new(size_t size)
{
    if(C==mempool)
    {
       C=new Trie[(1<<15)+10];
       mempool=C+(1<<15)+10;
    }
    return C++;
}
int n;
inline void insert(char *S,int x)
{
    int len=strlen(S);
    Trie *now=root;
    for(int i=0;i<len;i++)
    {
      if(now->ch[S[i]-a]==NULL)
       now->ch[S[i]-a]=new Trie;
      now=now->ch[S[i]-a];
    }
    now->who=x;
}
inline void build()
{
    q[0]=root;
    for(int i=0,j=0;i<=j;i++)
     for(int l=0;l<26;l++)
      if(q[i]->ch[l])
      {
         Trie *now=q[i]->fail;
         while(now&&!now->ch[l])now=now->fail;
         q[i]->ch[l]->fail=now?now->ch[l]:root;
         q[++j]=q[i]->ch[l];
         q[j]->last=q[j]->fail->who?q[j]->fail:q[j]->fail->last;
      }
}
inline void Init()
{
  root=new Trie;
  scanf("%d",&n);
  for(int i=1;i<=n;i++)   
  {
    scanf("%s",c[i]);
    insert(c[i],i);
  }  
  scanf("%s",s);
  build();
}
int sum[11];
inline void work()
{
  Trie *now=root;
  for(int i=0;s[i];i++)
  {
    int to=s[i]-a;
    while(now&&!now->ch[to])now=now->fail;
    now=now?now->ch[to]:root;
    for(Trie *Now=now;Now;Now=Now->last)
     sum[Now->who]++;
  }
}
inline void print()
{
  for(int i=1;i<=n;i++)
    printf("%s %d\n",c[i],sum[i]);
}
int main()
{
  freopen("ACautomata.in","r",stdin);
  freopen("ACautomata.out","w",stdout);
  Init();
  work();
  print();
  return 0;
}

 

AC自动机

标签:nbsp   init   ==   har   string   algo   eof   clu   ++   

原文地址:http://www.cnblogs.com/TSHugh/p/7125636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!