[专题总结]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图无环啦

猜你喜欢

转载自www.cnblogs.com/hzoi-DeepinC/p/11057983.html