AC自动机总结

                       AC自动机
                                                         (不写写我一会就忘了)
 用途:
 多个字符串是否在某个(某几个)字符串中出现,出现的次数。。。。
 思路:
 1.建一棵trie树
 2.建fail数组
 3.计算
 first.建trie树
   ①申明struct trie{
       int son[....]; 字符串的范围 如 小写字母就26
       int fail; 失败指针
       int id;每个字符串的编号,按输入顺序} A[....]
   ②insert (char *s,int v) {
       int p=root; L=strlen(s);
       for (int i=0;i<L;i++)
       {
          int x; 
          x=s[i]-'a';//以小写字母举例
          if (A[p].son[x]) p=A[p].son;
          else {A[p].son[x]=cnt;p=cnt++;} //cnt 是指那个字符的编号
      }
  second.求fail
   用队列维护
 void buildfail(){
   p=root; A[p].fail=root;
   根的子节点入队,fail指向根。
   while(!q.empty()){
     int u=q.front(); q.pop();

     for (int i=0;i<26;i++)//枚举每个的子节点
       if (A[u].son[i])//如果存在
      {
          int f=A[u].fail;
          while(!A[f].son[i]&&f) f=A[f].fail;
          if (A[f].son[i]==0) A[A[u].son[i]]=root; else A[A[u].son]=A[f].son[i];
          q.push(A[u].son[i]);
        }
   } 
}
Third 计算
  for (int j=0;j<strlen(目标串);j++){
   求出串的第j项:i
   if (A[p].son[i]) p=A[p].son[i];
   else {
     int f=A[p].fail;
     while(!A[f].son[i]&&f) f=A[f].fail;
     if(A[f].son[i]) p=A[f].son[i];else p=0;
   }
  if (A[p].v) work;
}

 










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值