[专题总结]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图无环啦
$Fate \ is \ Fake$