kmp之前沒學,然後排位賽又有一道題考了這個知識點,這題ac了一列人,就差我乙個......
kmp演算法:建立乙個next函式,從而使字串匹配的時間複雜度由o(n*n)變成o(n+m)。
舉個例子:
ababcab 和 abbbcabdc
首先建立next陣列,next[0] = -1
ababcab
-10012012就是next陣列了
例題:
對於乙個字串,可以在後面新增字元,怎麼新增最少的字元使得這個字串變成由乙個至少兩遍字首迴圈而成.
第一行輸入乙個t。總共t組資料第二行輸入乙個字串,( 3 <= 長度 <= 100000 ).
最少的新增的字元個數,每個輸出佔一行。qweqwe 剛好兩遍迴圈,所以新增0
qweqe 沒有兩遍,所以新增為5,字元為qweqe 。.
ababa 有兩遍迴圈,但是第三次不完整,所以新增數為1.
3aaaabca
abcde
025
ac的標程**(帶解析):
// 1 題目要求的是給定乙個字串,問我們還需要新增幾個字元可以構成乙個由n個迴圈節組成的字串。
// 2 可知我們應該先求出字串的最小迴圈節的長度:假設字串的長度為len,那麼最小的迴圈節就是cir = len-next[len] ; 如果有len%cir == 0,那麼這個字串就是已經是完美的字串,不用新增任何字元;如果不是完美的那麼需要新增的字元數就是cir - (len-(len/cir)*cir)),相當與需要在最後乙個迴圈節上面新增幾個。
// 3 如果cir = 1,說明字串只有一種字元例如「aaa」 ; 如果cir = m說明最小的迴圈節長度為m,那麼至少還需m個;如果m%cir == 0,說明已經不用新增了
#include#include#include#includeusing namespace std;
#define n 100010
char s[n];
int nextval[n];
int len;
void getnext(const char *s)
}int main()
{ int ncase;
int length, add;
scanf("%d", &ncase);
while(ncase--)
{ scanf("%s", s);
len = strlen(s);
getnext(s);
/* for(int i = 0; i <= len; ++i) //檢視next陣列的內容
cout<
附上個部落格: 我就是看這個部落格懂的這題
kmp演算法例題 登山
有一座延綿不斷 跌宕起伏的山,最低處海拔為0,最高處海拔不超過8848公尺,從這座山的一端走到另一端的過程中,每走1公尺海拔就公升高或降低1公尺。有q個登山隊計畫在這座山的不同區段登山,當他們攀到各自區段的最高峰時,就會插上隊旗。請你寫乙個程式找出他們插旗的高度。輸入格式 第1行,輸入乙個整數n n...
Dijkstra演算法 例題
dijkstra演算法 從起點到終點求最短路 使用要求權值為正 1 求短路i 題目 點數 500 邊數 1e5 include include include using namespace std const int n 510,m 1e5 10 時間複雜度o n m int n,m 鄰接矩陣 i...
模擬演算法例題
一 火柴棒 題目描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 1 加號與等號各自需要兩根火柴棍 2 如果a b,則a b c與b a c視為不同的等式 a b c 0 3...