魔法權值(字串排列 最小迴圈節)

2021-10-21 21:11:21 字數 1200 閱讀 4762

[程式設計題]魔法權值

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 32m,其他語言64m

給出 n 個字串,對於每個 n 個排列 p,按排列給出的順序(p[0] , p[1] … p[n-1])依次連線這 n 個字串都能得到乙個長度為這些字串長度之和的字串。所以按照這個方法一共可以生成 n! 個字串。

乙個字串的權值等於把這個字串迴圈左移 i 次後得到的字串仍和原字串全等的數量,i 的取值為 [1 , 字串長度]。求這些字串最後生成的 n! 個字串中權值為 k 的有多少個。

注:定義把乙個串迴圈左移 1 次等價於把這個串的第乙個字元移動到最後乙個字元的後面。

輸入描述:

每組測試用例僅包含一組資料,每組資料第一行為兩個正整數 n, k , n 的大小不超過 8 , k 不超過 200。接下來有 n 行,每行乙個長度不超過 20 且僅包含大寫字母的字串。

輸出描述:

輸出乙個整數代表權值為 k 的字串數量。

輸入例子1:

3 2

abraab

ra

輸出例子1:

3
題解:這道題手擼乙個全排列不難,難點應該在如何求最小迴圈節,我們直接套用kmp的模板求最小迴圈節

#include using namespace std;

int main()

functiongetnext = [&](string s) else }};

functioncheck = [&]()

getnext(st);

int sz = (int)st.size();

int len = sz - next[sz];

int ret = 1;

if (sz % len == 0)

return ret == k;

};functiondfs = [&](int pos)

return;

}for (int i = pos; i < n; i++)

};dfs(0);

cout << ret << "\n";

return 0;

}

NEXT陣列與字串最小迴圈節

結論 通過next陣列,可以得到字串的最小迴圈節。設字串s的結尾下標為i,next i j,如果 left j ne0 i i j 0 end right.成立,那麼s j 1,i 就是字串的最小迴圈節。簡要說明 1 x j y i 設s x,j s j,i 由於s 1,j s y,i 並且 s 1...

KMP演算法求字串的最小迴圈節

說到求字串的最小迴圈節就不得不提及kmp演算法 因為要求迴圈節,還需要用到kmp演算法的next陣列 kmp演算法本來是用來求乙個串中是否包含另乙個串,或者說乙個串是否為另乙個串的子串 kmp演算法詳解,看不懂算我輸 如果kmp演算法理解其原理了,那麼這道題也是非常簡單的 用了kmp中的next陣列...

HDU3746 (KMP)字串最小迴圈節問題

傳送門 題意 給你乙個串,要你在串頭或尾新增最少的字元,使得該串至少有2個迴圈節,問你最少需要加幾個字元.如 aaa 迴圈為 a 已有3個迴圈節 abca 迴圈節為abc 至少在末尾加 bc 使得該串至少有2個迴圈節 abcde 迴圈節為abcde 至少在末尾加 abcde 使得該串至少有2個迴圈節...