日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ACM入门之【KMP】

發布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。