hdu KMP中級題目總匯

2022-05-24 10:57:12 字數 2189 閱讀 5815

首先看我對kmp解決週期、字首與字尾間關係的解釋

hdu 3336  count the string

題意:求給定字串含字首的數量

abab

字首為a

ababa

abab

abab中共有六個子串是字首a a ab ab aba abab

所以答案為6

利用kmp中的匹配原理可以完美的解決此題

a---------d-----

-----a---------d

i         j

如上所示,假設兩串字元完全相等,next[j]=i,代表s[1...i]==sum[j-i+1....j],這一段其實就是字首

i~j之間已經不可能有以j結尾的子串是字首了,不然next【j】就不是 i 了

設dp【i】:以string[i]結尾的子串總共含字首的數量

所以dp[j]=dp[i]+1,即以i結尾的子串中含字首的數量加上前j個字元這一字首

view code

#include

#include

int n,m;

char b[200010];

int p[200010];

void get_p()

}int dp[200010];//

dp【i】:以string[i]結尾的子串總共含字首的數量

int main()

printf("

%d\n

",sum);

}}

hdu  3746cyclic nacklace

求最少需要在結尾後面補幾個字元才能湊成兩個迴圈

kmp最小迴圈節的應用

view code

#include

#include

int n,m;

char b[100010];

int p[111111];

void getp()

}int main()

}

hdu  1358 period 

求某個字首含幾個迴圈

典型的利用next【】求週期的題目

view code

#include

#include

char b[1000001];

int p[1000001];

int m;

void

get()

}int main()

}

hdu 2087

這裡要注意匹配的時候如果成功了,直接把j指標賦值為0

因為aaa   aa

只匹配一次

view code

#include

#include

char b[1000001];

char a[1000010];

int p[1000001];

int m,n;

void getp()

}int kmp()

}return cnt;

}int main()

}

hdu 2594

錯了6次,7a的題目。。。不夠細心啊

題目要求最長的a的字首同時滿足是b的字尾

先把後面的那串字串接到前面的字串的後面

利用next的特性,如果next【len(a+b)】> len(a)  ,繼續利用next【next【len(a+b)】】來比較

如果next【len(a+b)】> len(b)  ,繼續利用next【next【len(a+b)】】來比較

兩組資料很好的解釋了這個操作

abcabcabcabc

abcabcabcabcabc

12abcabc

abc3

view code

#include

#include

char b[50010];

char a[100010];

int p[100010];

int m,n;

void getp()

}int main()

else printf("

0\n");}}

/*abcabcabcabc

abcabcabcabcabc

12abcabc

abc3

*/

華為OJ中級題 座標移動

開發乙個座標計算工具,a表示向左移動,d表示向右移動,w表示向上移動,s表示向下移動。從 0,0 點開始移動,從輸入字串裡面讀取一些座標,並將最終輸入結果輸出到輸出檔案裡面。輸入 合法座標為a 或者d或者w或者s 數字 兩位以內 座標之間以 分隔。非法座標點需要進行丟棄。如aa10 a1a yad ...

華為OJ中級題 密碼驗證合格程式

密碼要求 1.長度超過8位 2.包括大小寫字母.數字.其它符號,以上四種至少三種 3.不能有相同長度超2的子串重複 bool funjgm string test 0數字,1大寫,2小寫,3其他符號 if len 8 if islower test i if isupper test i if is...

每日一題力扣135 分糖果 中級

老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。評分更高的孩子必須比他兩側的鄰位孩子獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?我的答案 就是列表兩側加0,...