Week15作業 C ZJM與紙條 KMP

2021-10-06 17:16:06 字數 1174 閱讀 1369

zjm 的女朋友是乙個書法家,喜歡寫一些好看的英文書法。有一天 zjm 拿到了她寫的紙條,紙條上的字暗示了 zjm 的女朋友 想給 zjm 送生日禮物。zjm 想知道自己收到的禮物是不是就是她送的,於是想看看自己收到的禮物在紙條**現了多少次。

第一行輸入乙個整數代表資料的組數

每組資料第一行乙個字串 p 代表 zjm 想要的禮物, 包含英語字元 , 並且字串長度滿足 1 ≤ |p| ≤ 10,000 (|p| 代表字串 p 的長度).

接下來一行乙個字串 s 代表 zjm 女朋友的紙條, 也包含英語字元 , 滿足 |p| ≤ |s| ≤ 1,000,000.

輸出一行乙個整數代表 p 在 s**現的次數.

使用kmp演算法來求解,kmp是在暴力匹配演算法的基礎上進行優化的演算法,它跳過了那些絕不可能成功的字串比較。

令next[i]的值是使得p[0…i]這乙個子串的k-真字首等於k-真字尾的最大的k。那麼如果在p[r]失配,那麼對於p[0…r-1]這一段,前next[r-1]個字元一定和後next[r-1]個字元相等,可以拿長度為next[r-1]的字首來替代當前的字尾,讓p[next[r-1]]這個字元對準剛剛失配的位置,從而跳過不可能成功的字串比較。

接下來要求next陣列。顯然next[0]=0,要遞推計算next陣列,即已知next[0…x-1],求next[x]。簡記next[x-1]為now,共有兩種情況:情況1,p[x]=p[now],說明p[0…x]相等的前字尾是字串p[0…x-1]加上p[x],即next[x]=now+1;情況2,p[x]!=p[now],嘗試縮短now,但仍要保證對於p[0…x-1]而言,它的now-真字首等於now-真字尾,即now=next[now-1]。

一道kmp演算法求解字串問題,需要好好理解一下kmp演算法。這道題用g++可能會t,但相同**用c++就能a,很神奇。

#include

#include

using

namespace std;

int zs;

int next[

10010];

void

getnext

(string ptr)

}int

kmp(string str,string ptr)

}return cnt;

}int

main()

}

程式設計思維與實踐 Week15 作業

problem description 哈利波特在魔法學校的必修課之一就是學習魔咒。據說魔法世界有100000種不同的魔咒,哈利很難全部記住,但是為了對抗強敵,他必須在危急時刻能夠呼叫任何乙個需要的魔咒,所以他需要你的幫助。給你一部魔咒詞典。當哈利聽到乙個魔咒時,你的程式必須告訴他那個魔咒的功能 當...

程式設計思維與實踐 Week15 作業

zjm 為了準備霍格沃茲的期末考試,決心背魔咒詞典,一舉拿下咒語翻譯題 題庫格式 魔咒 對應功能 背完題庫後,zjm 開始刷題,現共有 n 道題,每道題給出乙個字串,可能是 魔咒 也可能是對應功能 zjm 需要識別這個題目給出的是 魔咒 還是對應功能,並寫出轉換的結果,如果在魔咒詞典裡找不到,輸出 ...

week15作業(只有比做)

問題描述 zjm 為了準備霍格沃茲的期末考試,決心背魔咒詞典,一舉拿下咒語翻譯題 題庫格式 魔咒 對應功能 背完題庫後,zjm 開始刷題,現共有 n 道題,每道題給出乙個字串,可能是 魔咒 也可能是對應功能 zjm 需要識別這個題目給出的是 魔咒 還是對應功能,並寫出轉換的結果,如果在魔咒詞典裡找不...