[程式設計題]魔法權值
時間限制: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輸出例子1:abraab
ra
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個迴圈節...