• [专题总结]AC自动机


    其实前面的模板也不是1A,我在题库里提前做过,也不必在意罚时,刚开始我在做别的专题

    裸模板我就不说了,各个博客讲解的很明白

     1 void insert(string s){
     2     int p=0,len=s.size();
     3     for(int i=0;i<len;++i)
     4         if(c[p][s[i]-'a'])p=c[p][s[i]-'a'];
     5         else p=c[p][s[i]-'a']=++cnt;
     6     ++iii;bj[p].push_back(iii);pos[iii]=p;
     7 }
     8 void bfs(){
     9     int qt=0;
    10     for(int i=0;i<=25;++i)if(c[0][i])q[++qt]=c[0][i];
    11     for(int qh=1;qh<=qt;++qh)
    12         for(int j=0;j<=25;++j)
    13             if(c[q[qh]][j])fail[q[++qt]=c[q[qh]][j]]=c[fail[q[qh]]][j];
    14             else c[q[qh]][j]=c[fail[q[qh]]][j];
    15 }
    16 void find(string s){
    17     int pp=0,len=s.size();++iii;
    18     for(int i=0;i<len;++i){
    19         pp=c[pp][s[i]-'a'];int k=pp;
    20         while(k){
    21             if(al[k]==iii)break;
    22             if(!bj[k].empty())for(int i=0;i<bj[k].size();++i)if(bj[k][i]<iii)p[++pcnt]=bj[k][i];
    23             k=fail[k];al[k]=iii;
    24         }
    25     }
    26 }
    纯模板(最终常用形态)

    事实上,trie树并没有什么用,基本上建的都是trie图

    DP还是有点意思的,但是说白了都是一个套路

    最短母串:

    其实我用的不是AC自动机,因为没跑trie图所以没有必要建出来,只不过是把所有是别的串的字串者预处理干掉能让dp简单许多,最后没用AC自动机代码性能反而提高了。

    文本生成器/禁忌:

    裸的AC自动机跑trie图,就是问跑len步之后会停在哪里,或者路过了几个标记节点等等。。。禁忌稍微结合了一下矩阵快速幂,就没什么了。

    教练把SPJ打错了还说我代码有问题嘤嘤嘤~3e6的输出答案误差1e-5我能怎么办呀?教练不读题然后还屠我两节课嘤。

    背单词:

    奇裸无比,是唯一一个没跑图而要找字串的。直接预处理字串,读入时忽视负权值字串能防T,然后裸DP,超无聊。

    密码:

    挺麻烦的一道题。关键是需要输出最后组成的串,存一大堆东西再逆DFS回溯回去就好了。

    虽说病毒那道题是模板,但是它的思路值得一想。问是否存在无限长的串使之不匹配。

    就是trie图无环啦

  • 相关阅读:
    jQuery插件开发精品教程,让你的jQuery提升一个台阶
    Elasticsearch 更新和删除文档的过程
    Elasticsearch集群健康状态显示为yellow排查
    Golang官方包依赖管理工具 go mod
    Golang几种常用配置文件使用方法总结
    SQL高级功能:窗口函数
    MySQL经典50题
    MySQL 性能调优和系统资源优化解决方案
    【排序算法】堆排序的推导及实现
    增长策略:如何用AB测试进行活动评估及优化?
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11057983.html
Copyright © 2020-2023  润新知