ACM入门之【KMP】
生活随笔
收集整理的這篇文章主要介紹了
ACM入门之【KMP】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
KMP可以O(n)的時間查找出一個字符串在另一個字符串出現的次數和位置。
KMP 的精髓在于,對于每次失配之后,我都不會從頭重新開始枚舉,而是根據我已經得知的數據,從某個特定的位置開始匹配;而對于模式串的每一位,都有唯一的“特定變化位置”,這個在失配之后的特定變化位置可以幫助我們利用已有的數據不用從頭匹配,從而節約時間。
模板:
const int N=1e6+10; char a[N],b[N];//讓其下標從1開始 int n,m,ne[N];//ne[i]表示前i個字符的最長的相等的前后綴 void init() {cin>>n>>a+1>>m>>b+1;for(int i=2,j=0;i<=n;i++){while(j&&a[i]!=a[j+1]) j=ne[j];if(a[i]==a[j+1]) j++;ne[i]=j;}for(int i=1,j=0;i<=m;i++){while(j&&b[i]!=a[j+1]) j=ne[j];if(b[i]==a[j+1]) j++;if(j==n)//求a在b出現的所有的位置{cout<<i-n<<" ";//下標從0開始j=ne[j];}} }KMP的擴展應用:在一個字符串中找出最小周期,但這個周期在開頭和結尾不一定是完整的n-ne[n] 就是最小的循環節長度
入門習題:
831. KMP字符串
P3375 【模板】KMP字符串匹配
P4391 [BOI2009]Radio Transmission 無線傳輸
141. 周期
總結
以上是生活随笔為你收集整理的ACM入门之【KMP】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACM入门之【单调栈】
- 下一篇: ACM入门之【字典树/Trie】