首先看我對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
#includehdu 3746cyclic nacklace#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);
}}
求最少需要在結尾後面補幾個字元才能湊成兩個迴圈
kmp最小迴圈節的應用
view code
#includehdu 1358 period#include
int n,m;
char b[100010];
int p[111111];
void getp()
}int main()
}
求某個字首含幾個迴圈
典型的利用next【】求週期的題目
view code
#includehdu 2087#include
char b[1000001];
int p[1000001];
int m;
void
get()
}int main()
}
這裡要注意匹配的時候如果成功了,直接把j指標賦值為0
因為aaa aa
只匹配一次
view code
#includehdu 2594#include
char b[1000001];
char a[1000010];
int p[1000001];
int m,n;
void getp()
}int kmp()
}return cnt;
}int main()
}
錯了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,...