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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

KMP模版

發布時間:2024/3/26 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 KMP模版 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字符串實在是太多圖片了,所以為了保存我的筆記,寫博客就是最好的辦法

1.KMP模版(出自caioj,但是現在不可以注冊,所以我就把題面放上來)

1177: [視頻]KMP模版:子串是否出現(元問題 by scy)

時間限制: 1 Sec??內存限制: 256 MB
提交: 686??解決: 455
[提交] [狀態] [討論版] [命題人:admin]

題目描述

【題意】
有兩個字符串SA和SB,SA是母串,SB是子串,問子串SB是否在母串SA中出現過。
如果出現過輸出第一次出現的起始位置和結束位置,否則輸出"NO"
【輸入文件】
第一行SA(1 <= 長度 <= 100 0000)
第二行SB(1 <= 長度 <= 1000)
【輸出文件】
如果SB在SA中出現過輸出第一次出現的起始位置和結束位置,否則輸出"NO"
【樣例1輸入】
aaaaabaa
aab
【樣例1輸出】
4 6
【樣例2輸入】
aaaaabaa
aax
【樣例2輸出】 NO

我們第一個想到的一定是樸素算法,就是我們在sa長度每一個枚舉sb的長度,看看有沒有相同的,但是很遺憾,因為數據10萬,O(nm)的時間復雜度怎么可能不炸呢?

所以我們就要用到一個很高級的東西就是KMP算法,這個算法是專門處理這些尋找字符串配對的一個算法,很好理解也很好實現,所以看一下我們下面的解釋

我們需要定義一個p數組,這個p數組就是KMP模版題的最關鍵的地方

?

p[ ]是記錄sb[ ]當中從后面開始往前延伸幾個字符,可以與前面開始往后延伸幾個字符相匹配,
就是字符的后綴和字符的前綴進行匹配,僅僅與sb[ ]有關 記住:僅僅與sb[ ]有關

那么這個這么抽象的p數組到底是干什么用的呢?

因為我們是把前后匹配的,每一個sb的位置都要匹配,所以我們如果要找第i個位置的 p[i]的時候,我們可以選擇繼承 p[i-1]的,繼承分為兩種?

  • 第一種就是如果我們搜索到的前綴的后一個等于我們的i,那么我們的p[i]等于p[i-1]+1
  • 第二種就是不等于的,我重點講一下第二種情況

?這張圖非常的重要,(圖片看不清楚,一定要下載下來看清楚顏色的范圍)因為他非常清晰的描述了我們KMP算法高效率的實現過程,為了方便,我們先定義 j=p[i-1]

如果找不到的話,我們就將j繼承為 p[j]也就是上面圖中的 p[p[i-1]]的位置,然后按照一步一步往下,我們就可以找到和i相等或者根本找不到相等的,

所以就是這樣

?那么我相信到這里,大佬們已經不屑于看了,剩下就是代碼的實現

(注釋版,想要看代碼理解的實現就打開這個)

1 /*樸素算法:在sa字符串當中按照sb的長度枚舉,長度相同且字符相同的時候,記錄下來,時間復雜度O(nm)*/ 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<cmath> 7 #include<iostream> 8 using namespace std; 9 char sa[1000010],sb[1010]; 10 int p[1010]; 11 /*p[]是記錄sb[]當中從后面開始往前延伸幾個字符,可以與前面開始往后延伸幾個字符相匹配, 12 就是字符的后綴和字符的前綴進行匹配,僅僅與sb[]有關*/ 13 int main() 14 { 15 scanf("%s%s",sa+1,sb+1); 16 int lena=strlen(sa+1),lenb=strlen(sb+1); 17 p[1]=0;/*p數組初始化*/ 18 for(int i=2;i<=lenb;i++) 19 { 20 int j=p[i-1];/*偷懶操作,如果前面一個人找到了,然后我們現在要搜索的,與前面匹配完的后一個相同,那么就很好了*/ 21 while(j>0 && sb[i]!=sb[j+1]) j=p[j];/*這個就是p[]的重要性,不能直接繼承前面的狀態的話,就進行一個很神奇的操作 22 |1--la----lb--|2-|6------|3--lc----ld--|4-|5---- 23 (這是一個很抽象的圖,l5表示我們當前要匹配的,l3-l4是上一個匹配好的,l1-l2是和上一個匹配的前綴) 24 然后我們發現l5!=l6,所以不能繼承前面的狀態,那就意味著要重新搜索?不,我們可以把j定義到l2這個位置,也就是p[j], 25 為什么呢?因為我們把l2作為我們要搜索匹配的最后一個數,然后往前搜索,顯然: 26 l1~la=lb~l2=l3~lc=ld~l4,但是我們需要的只是l1~la=ld~l4,因為他們相同,并且他們的下一個分別相同,那么我們的i就匹配完了, 27 就可以退出記錄答案了,但是如果不匹配,就繼續將j定義到la這個位置,讓他搜索*/ 28 if(sb[i]==sb[j+1]) p[i]=j+1; else p[i]=0; /*如果相同,就直接記錄答案,否則沒有答案(退出while之后才會來到這里)*/ 29 } 30 int st,ed,j=0;/*j表示匹配成功的個數*/ 31 for(int i=1;i<=lena;i++)/*這個就是關于我們匹配好的p[]要怎么運用?*/ 32 { 33 /* 34 ------------|a--|5-|6--|b-l1------- sa 35 |c--|3-|4--|d-l2-- sb 這里表示兩個字符串,然后我們從1開始枚舉lena,發現有相同之后就j++,當然我們自然希望下一位繼續相同, 36 但是如果不相同呢?那就要用到我們的p[],假設當前j=5,然后分割出來的兩個區間是完全相同的,同樣的l1!=l2 37 這個時候我們就把j定義當ld,搜索到: lc~l3=l4~ld=la~l5=l6~lb,然后我們的目的就是要讓 38 lc~l3=lb~lb,這個時候只要他們的下一個相同就又有一部分相同的,就是這個道理和上面的是一樣的 39 */ 40 while(j>0 && sa[i]!=sb[j+1]) j=p[j]; 41 if(sa[i]==sb[j+1]) j++; 42 if(j==lenb){ed=i; st=i-lenb+1; break;} 43 } 44 if(j==lenb) printf("%d %d\n",st,ed); else printf("NO\n"); 45 return 0; 46 } Tristan code 注釋版

?

(非注釋版,已經能夠理解并且打出代碼的就看這個)

1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<iostream> 7 using namespace std; 8 char sa[1000010],sb[1010]; 9 int p[1010]; 10 int main() 11 { 12 scanf("%s",sa+1); scanf("%s",sb+1); 13 int lena=strlen(sa+1),lenb=strlen(sb+1); 14 p[1]=0; 15 for(int i=2;i<=lenb;i++) 16 { 17 int j=p[i-1]; 18 while(j>0 && sb[i]!=sb[j+1]) j=p[j]; 19 if(sb[i]==sb[j+1]) p[i]=j+1; else p[i]=0; 20 } 21 int st,ed,j=0; 22 for(int i=1;i<=lena;i++) 23 { 24 while(j>0 && sa[i]!=sb[j+1]) j=p[j]; 25 if(sa[i]==sb[j+1]) j++; 26 if(j==lenb){ed=i; st=i-lenb+1; break;} 27 } 28 if(j==lenb) printf("%d %d\n",st,ed); else printf("NO\n"); 29 return 0; 30 } Tristan Code 非注釋版

?

轉載于:https://www.cnblogs.com/Tristanjiang/p/11356379.html

總結

以上是生活随笔為你收集整理的KMP模版的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲高清在线观看视频 | 波多野结衣亚洲视频 | 人妻久久久一区二区三区 | 国产精品免费视频一区二区 | 精品国产aⅴ一区二区三区四川人 | 夜夜免费视频 | 国产亚洲欧美在线视频 | 最新久久久| 人人看人人艹 | 日本αv| 偷拍xxxx| 天天干天天操天天操 | 国产一区二区三区精品在线观看 | 91嫩草精品 | 俄罗斯videodesxo极品 | 热久久久久 | www.97色| 黑人玩弄人妻一区二区三区 | 美景之屋电影免费高清完整韩剧 | 欧美一区二区三区视频在线观看 | 国产尤物av| 亚洲一区二区免费电影 | 狠狠综合网| 日韩高清免费av | 亚洲日本在线观看视频 | 女同性做爰全过程 | 国产精品无码内射 | 99热亚洲精品 | 欧美jjzz| 欧美激情三级 | 国产91精品在线观看 | 亚洲热久久 | 蜜桃精品视频在线观看 | 激情欧美一区二区三区精品 | 日韩精品一区二区三区免费视频 | 黄色免费观看网站 | 少妇太紧太爽又黄又硬又爽 | 亚洲av毛片一区二二区三三区 | 日本特黄视频 | 影音先锋欧美在线 | 天天操天天做 | 中文字幕乱轮 | 幸福,触手可及 | 国产激情视频一区二区三区 | 青青草免费公开视频 | 91pao| 永久免费成人代码 | 午夜成人鲁丝片午夜精品 | 波多野结衣理论片 | 欧美黄色a级 | 美女三级黄色片 | 中文字幕在线观看网址 | 欧美一级大片 | 成人免费在线视频 | 国产精品99精品无码视 | 日本不卡二区 | 国产精品一线二线 | 欧美三级在线看 | 日一区二区 | 熟女高潮一区二区三区 | brazzers精品成人一区 | 欧美一级一级 | 免费一区视频 | 日韩精品在线一区二区 | 中国美女乱淫免费看视频 | 成人黄色小说在线观看 | 亚洲男人天堂2023 | 91亚洲精品久久久蜜桃网站 | 美女又黄又免费 | 日韩城人视频 | 免费国产黄色网址 | 男人av网站 | 亚洲综合色av | 日本美女三级 | 久久66热这里只有精品 | 少妇高潮一区二区三区在线 | 久久综合久久网 | 色综合天天综合综合国产 | 日韩三级中文字幕 | 国产福利不卡视频 | 婷婷综合另类小说色区 | 又欲又污又肉又黄短文 | 亚洲视频在线一区二区 | 精品一二三区 | 欧美激情视频在线 | 国产孕妇一区二区三区 | 亚洲国产亚洲 | 亚洲一区二区在线观看视频 | 国产三级一区二区三区 | 免费视频亚洲 | 女人免费视频 | 天天爱综合 | 欧美中文字幕在线视频 | a级片免费在线观看 | 欧美在线一区二区视频 | 免费人成又黄又爽又色 | 色天使亚洲 | 黄色免费观看网站 | 亚洲中字 |