【string】KMP, 扩展KMP,trie,SA,ACAM,SAM,最小表示法
【KMP】
学习KMP,我们先要知道KMP是干什么的。
KMP?KMPLAYER?看**?
正如AC自动机,KMP为什么要叫KMP是因为它是由三个人共同研究得到的- .-
啊跑题了。
KMP就是给出一个母串S和串T,然后看T是不是S的子串。
易想到朴素算法,且时间复杂度是明显的O(NM).
那么为什么KMP的复杂度会这么高呢?
因为每次失配的时候,指针只是简单的把在S串的指针向后移动一位,T串回到开头,其中对于子串T已匹配过的信息没有充分利用。
KMP是干嘛的?
利用一个next数组使得失配时T的指针不是简单的移动到开头而是移动到T串的某个以匹配位置上。
在这里还是来说明一下怎么利用next数组吧。
先来说说next数组吧,下面给出T串为abcababdb的各next[i]值。
next数组的意义:当当前位的后一位失配的时候指针应该移动到的位置。
具体怎么用呢?
我们设S:abcdabcababcababdb
T还是那个T。
好了,基本就是这些吧。。代码还是贴一贴,为了一些还是不太理解的同学加(chao)深(dai)理(ma)解。什么?next数组怎么求?把t和自己kmp一次就可以啦。。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 6 using namespace std;; 7 8 char p[1000],s[10001]; 9 10 int next[1001]; 11 12 void make_next() 13 { 14 for(int q=1,k=0;q<strlen(p);q++) 15 { 16 while(k&&p[q]!=p[k]){ 17 k=next[k-1]; 18 } 19 if(p[q]==p[k]){ 20 k++; 21 } 22 next[q]=k; 23 } 24 } 25 26 int main() 27 { 28 scanf("%s%s",p,s); 29 make_next(); 30 for(int i=0,k=0;i<strlen(s);i++) 31 { 32 while(k&&s[i]!=p[k]) 33 k=next[k-1]; 34 if(s[i]==p[k])k++; 35 if(k==strlen(p)){ 36 printf("%d\n",i+1-strlen(p)); 37 } 38 } 39 return 0; 40 }
【扩展KMP】
【trie】
【SA】
【ACAM】
待学习。。
【SAM】
待学习。。
貌似好久没写blog了。。
先挖个大坑慢慢更新。。。