week15選做 字典樹 KMP

2021-10-07 04:06:23 字數 2077 閱讀 2484

思路:經典字典樹

flag[i]代表第i個節點是否某為乙個字串的終點。

child[n][2]代表字典樹,儲存每乙個節點的rank,child[i][0]==-1代表第i個節點的左子樹為空,

對於每乙個字串,對每乙個字元進行處理。

這是向字典樹中插入字元的函式,即**的精華部分。

int

insert

(string str)

else

crt=child[crt]

[x];

} flag[crt]=1

;return judge;

}

完整**:

kmp演算法:

找了很多部落格,都寫的亂七八糟,沒有注釋的**和胡亂畫的圖,搞得我在kmp演算法上浪費了很多時間。直到看到了這篇:

傳送門-對kmp演算法解析並模擬的部落格

這篇部落格寫得真的好,是我見過的寫得最清楚明白的原創部落格,吹爆~

當然了,看完了不一定理解的話,需要自己手動模擬一遍。

關鍵**:

求最長相同前字尾長度以及匹配過程:

//不加注釋能直接看懂這段的都是大神!

/*get_f(string)

求字串的最長相同前字尾長度

從位置1(第二個字元)開始遍歷

如:字串aa,f[1]=1;f儲存的是最長相同前字尾中字首最後乙個字元的位置

看不懂的可以手動模擬一下

*/void

get_f

(char

*x)if

(x[j+1]

==x[i]

)else}}

void

kmp(

char

*a,char

*b)}

else

else

}//其實只要自己寫個例子模擬一下,非常好理解,

//單看**很難理解。

} cout<

}

完整**:

#include

#include

//卡了stl,這個string用不得

#include

using

namespace std;

//string p,s;

int t;

int f[

10010];

char p[

10010];

char s[

1000010];

int m;

int n;

void

void

get_f

(char

*x)if

(x[j+1]

==x[i]

)else}}

void

kmp(

char

*a,char

*b)}

else

else}}

cout<

}int

main()

return0;

}

Week15 選做部分

採用字典樹的方式來解決字串匹配問題 再插入過程中判斷是否可以匹配 1 最後乙個字元落到已存在的節點 2 經過其他字串的尾部 include include using namespace std struct trie bool insert char str else if flag child ...

Week15作業 B ZJM與生日禮物 字典樹

zjm 收到了 q老師 送來的生日禮物,但是被 q老師 加密了。只有 zjm 能夠回答對 q老師 的問題,q老師 才會把密碼告訴 zjm。q老師 給了 zjm 一些僅有 01 組成的二進位制編碼串,他問 zjm 是否存在乙個串是另乙個串的字首。多組資料。每組資料中包含多個僅有01組成的字串,以乙個9...

程式設計 Week15 必做題

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