【字符串算法】——重拾KMP与AC自动机
——这两个玩意是好久以前学习的,现在大都忘记了,重新回忆一遍。 对于一个字符串S(文本串),我们拥有几个子串(模式串),如何去求出这些子串在S中位置? 这时候就要用到KMP算法。 简要构成就不叙述了,直接讲原理: eg: 如下两个串,上为文本串(S),下为模式串(T),我们从头开始匹配。 S:abcabdabd T:abcabc 到了某一位发现不一样: S:abcab d abd T:abcab c 那么我们就将模式串右移,因为ab两个字母是重复的。 S:abcabdabd T: abcabc 继续匹配…… 这个右移的过程是通过next数组实现的,它用来 确定失配后变化的位置 。 求next数组的方式: 很简单,不赘述了。 1 void nextst() 2 { 3 int j=0,k=-1; 4 nexts[0]=-1; 5 while(j<s2.length()){ 6 if(k==-1||s2[j]==s2[k]){ 7 nexts[++j]=++k; 8 } 9 else k=nexts[k]; 10 } 11 } 细心发现,这就是个模式串自匹配。 剩下的没啥好说的。 我懒。 模板 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int